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

Iqb*_*der 12 c c++ scope global-scope

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

Hit*_*ani 22

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

static int nValue; // file scoped variable
float fValue; // global variable

int main()
{
    double dValue; // local variable
}
Run Code Online (Sandbox Code Playgroud)

文件范围变量的行为与全局变量完全相同,只是它们的使用仅限于声明它们的文件.

  • 这不是文件范围。它是翻译单位范围。您可以将两个或多个.cpp文件包含到一个文件中,并且它们可以互相访问静态文件。 (2认同)
  • 这个答案混淆了术语,至少对于 C 来说。文件范围只是在任何块或参数列表之外(C99,6.2.1/P4)。fValue 和 nValue 均在文件范围内声明。Global 不是 C 标准命名法。它是文件范围中声明/定义的实体的白话术语。这两个变量都是全局变量,并且都在文件范围内声明。对于具有外部或内部链接的变量来说,并不意味着它是文件范围/全局的。请不要尝试使用这些术语来表示链接。 (2认同)

Ruf*_*fus 6

当实际上有多个翻译单元时,说明文件(或更准确地说,翻译单元)范围与全局范围可能更清楚......

取 2 个文件(每个文件都是它自己的翻译单元,因为它们不包含彼此)

其他.cpp

float global_var = 1.0f;
static float static_var = 2.0f;
Run Code Online (Sandbox Code Playgroud)

主程序

#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);
}
Run Code Online (Sandbox Code Playgroud)

因此区别很明显。


Rag*_*ull 2

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

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

例子:

static int nValue; // file scoped variable
float fValue; // global variable

int main()
{
    double dValue; // local variable
}
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多内容。