文件范围和全局范围:C&C ++

我是学生,我对C和C ++中的全局和文件范围变量感到困惑。 这两种观点有什么不同吗? 如果是,请详细说明。

具有文件范围的变量可以由单个文件中的任何函数或块访问。 要声明文件范围的变量,只需在块之外声明一个变量(与全局变量相同),但使用static关键字。

static int nValue; // file scoped variable float fValue; // global variable int main() { double dValue; // local variable } 

文件范围变量的行为与全局变量完全相同,不同之处在于它们的使用仅限于声明它们的文件。

如果标识符的声明出现在任何块之外,则名称具有file scope 。 具有文件范围和内部链接的名称从声明它到转换单元末尾的位置可见。

Global scopeglobal namespace scope是程序的最外层命名空间范围,其中可以定义对象,函数,类型和模板。 如果标识符的声明出现在所有块,名称空间和类之外,则名称具有全局名称空间作用域。

例:

 static int nValue; // file scoped variable float fValue; // global variable int main() { double dValue; // local variable } 

在这里阅读更多。

文件范围:在所有块或类之外声明的任何名称都具有文件范围。 它在声明后可以在翻译单元的任何地方访问。 具有不声明静态对象的文件范围的名称通常称为全局名称。

在C ++中,文件范围也称为命名空间范围。

当实际存在多个翻译单元时,可能更清楚地说明文件(翻译单元)-scope vs global scope …

拿两个文件(每个文件都是它自己的翻译单元,因为它们不相互包含)

other.cpp

 float global_var = 1.0f; static float static_var = 2.0f; 

main.cpp中

 #include  extern float global_var; //extern float static_var; // compilation error - undefined reference to 'static_var' int main(int argc, char** argv) { printf("%f\n", global_var); } 

因此差异很明显。

现在仔细阅读。

您可以在程序/代码的顶部使用那些#include <'...'。h>语句。 你实际在做什么告诉计算机参考那些* h * eader文件中预先写好函数 。也就是说,那些函数有文件范围。你不要写printf scanf的代码和这些函数,因为它们在某处头文件。

在函数外部声明的变量具有“文件范围”,这意味着它们在文件中可见。 使用文件范围声明的变量在它们的声明和编译单元的末尾(.c文件)之间是可见的,它们隐式地具有外部链接,因此不仅可以看到包含其声明的.c文件或编译单元,而且还可以看到其他所有变量。链接的编译单元,形成完整的程序。

顾名思义,全局变量可被视为可在全球范围内访问(无处不在)