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

17

我是一名学生,对C和C++中的全局变量和文件作用域变量感到困惑。这两种变量在不同方面是否有区别?如果有,请详细解释。


1
http://www.drdobbs.com/cpp/scope-regions-in-c/240002006 - odedsh
1
这里有一个类似的问题已经被回答了,你可能想要看一下:https://dev59.com/m2Yr5IYBdhLWcg3wAFk1 - user376507
1
我想问的不是它们之间的区别,因为在你的问题中提到了我检查了那些在C++中对于文件和全局作用域都起作用的示例,所以我才问这个问题。 - Iqbal Haider
5个回答

26

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

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

int main()
{
    double dValue; // local variable
}

文件范围变量的行为与全局变量完全相同,唯一的限制是它们只能在声明它们的文件中使用。


5
不是文件作用域,而是翻译单元作用域。您可以将两个或更多的.cpp文件包含到一个文件中,并且它们可以访问彼此的静态变量。 - Calmarius
2
这个答案混淆了术语,至少对于C语言而言是如此。文件作用域仅仅是指在任何块或参数列表之外(C99,6.2.1/P4)。fValue和nValue都在文件作用域中声明。Global不是C标准的命名法。它是指在文件作用域中声明/定义的实体的俗称术语。这两个变量都是全局的,并且都在文件作用域中声明。一个变量具有外部链接或内部链接并不意味着它是文件作用域/全局中的其中一个。请不要尝试使用这些术语来表示链接。 - Tammi

6
也许更清楚的是,在有多个翻译单元的情况下,用文件(或更准确地说,翻译单元)范围与全局范围进行说明...
拿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);
}

因此,差异变得清晰明确。

2
如果标识符的声明出现在任何块之外,则名称具有文件范围。 具有文件范围和内部链接的名称从声明处到翻译单元的结束可见。
全局作用域或全局命名空间作用域是程序的最外层命名空间作用域,在其中可以定义对象、函数、类型和模板。 如果标识符的声明出现在所有块、命名空间和类之外,则名称具有全局命名空间作用域。
示例:
static int nValue; // file scoped variable
float fValue; // global variable

int main()
{
    double dValue; // local variable
}

Read more here.


1

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

在C++中,文件作用域也称为命名空间作用域。


-4

仔细阅读。

在程序/代码顶部使用#include<'...'.h>语句,这实际上是告诉计算机在那些头文件中引用预写的函数。也就是说,这些函数具有文件作用域,你不需要编写printf scanf等函数的代码,因为它们在头文件中。

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

全局变量可以被认为是全局(到处)可访问的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接