我是一名学生,我对 C 和 C++ 中的全局和文件范围变量感到困惑。两种观点有区别吗?如果是,请详细说明。
5 回答
具有文件范围的变量可以被单个文件中的任何函数或块访问。要声明文件范围的变量,只需在块之外声明一个变量(与全局变量相同),但使用 static 关键字。
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
文件范围变量的行为与全局变量完全相同,只是它们的使用仅限于声明它们的文件。
当实际上有多个翻译单元时,说明文件(或更准确地说,翻译单元)范围与全局范围可能更清楚......
拿 2 个文件(每个都是它自己的翻译单元,因为它们不包含彼此)
其他.cpp
float global_var = 1.0f;
static float static_var = 2.0f;
主文件
#include <cstdio>
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);
}
因此区别很明显。
file scope
如果标识符的声明出现在任何块之外,则具有名称。具有文件范围和内部链接的名称从声明的位置到翻译单元的末尾都是可见的。
Global scope
orglobal namespace scope
是程序的最外层命名空间范围,可以在其中定义对象、函数、类型和模板。如果标识符的声明出现在所有块、命名空间和类之外,则名称具有全局命名空间范围。
例子:
static int nValue; // file scoped variable
float fValue; // global variable
int main()
{
double dValue; // local variable
}
在这里阅读更多。
文件范围:在所有块或类之外声明的任何名称都具有文件范围。它在声明后可以在翻译单元的任何地方访问。具有文件范围但不声明静态对象的名称通常称为全局名称。
在 C++ 中,文件范围也称为命名空间范围。
现在仔细阅读。
您在程序/代码的顶部使用那些#include<'...'.h>语句。你实际上在做什么是告诉计算机参考那些预先写在这些*h *eader 文件中的函数。也就是说,这些函数具有文件范围。你不编写 printf scanf 的代码和这些函数,因为它们在某处头文件。
在函数外部声明的变量具有“文件范围”,这意味着它们在文件中可见。使用文件范围声明的变量在它们的声明和编译单元(.c 文件)的末尾之间是可见的,并且它们隐式具有外部链接,因此不仅对包含它们的声明的 .c 文件或编译单元可见,而且对其他所有变量都可见链接以形成完整程序的编译单元。
顾名思义,全局变量可以被认为是全局可访问的(无处不在)