文件作用域和全局作用域的区别

Posted

技术标签:

【中文标题】文件作用域和全局作用域的区别【英文标题】:Difference between File Scope and Global Scope 【发布时间】:2014-03-20 20:42:15 【问题描述】:

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

【问题讨论】:

drdobbs.com/cpp/scope-regions-in-c/240002006 这里回答了一个类似的问题,你可能想看看***.com/questions/14027317/… 我想在你的问题中提到它们之间的区别 b/c 我检查了在 C++ 中用于文件和全局范围的示例,这就是我问这个问题的原因 【参考方案1】:

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

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

int main()

    double dValue; // local variable

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

【讨论】:

不是文件范围。这是翻译单元范围。您可以将两个或多个 .cpp 文件包含在一个文件中,并且它们可以访问彼此的静态数据。 这个答案混淆了术语,至少对于 C 而言。文件范围只是在任何块或参数列表之外(C99,6.2.1/P4)。 fValue 和 nValue 都在文件范围内声明。全局不是 C 标准命名法。它是在文件范围内声明/定义的实体的白话术语。这两个变量都是全局变量,并且都在文件范围内声明。对于具有外部或内部链接的变量,不会使其成为文件范围/全局。请不要尝试使用这些术语来表示关联。【参考方案2】:

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

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

其他.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】:

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

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

例子:

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

int main()

    double dValue; // local variable

阅读更多here。

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

现在仔细阅读。

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

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

顾名思义,全局变量可以被认为是全局可访问的(无处不在)

【讨论】:

以上是关于文件作用域和全局作用域的区别的主要内容,如果未能解决你的问题,请参考以下文章

eval全局作用域和局部作用域的坑!

C语言中 变量作用域的区别

js函数作用域和块级作用域的区别

前端:如何理解 JS 的作用域和作用域链?说说闭包的两个应用场景

作用域和作用域链

重温JavaScript(lesson3):作用域和闭包