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