C中具有相同名称的extern和全局变量

时间:2017-02-08 21:54:17

标签: c global external extern

我试图弄清楚如果在某些程序中我们会有这样的情况会发生什么:

extern int x;

void foo(){...}
void bar(){...}

void main(){
foo();
bar();
}
int x=0;

那么假设会发生什么?为什么允许两个具有相同名称的变量?它们是否不同?

3 个答案:

答案 0 :(得分:7)

他们不是"两个"变量。它们是相同的

extern int x;

x的声明。

int x=0;

提供x的定义。这非常好,有效。

您可以拥有多个声明,例如:

extern int x;
extern int x;

也是,它也会编译。

注意,当您为同一标识符提供多个声明时,规则有些复杂。有关详细信息,请参阅:6.2.2 Linkages of identifiers。 有关示例,请参阅static declaration of m follows non-static declaration

答案 1 :(得分:3)

非常好。 此

extern int x;

只声明int类型的变量x,而extern明确地说,它将在另一个位置定义。

在你的情况下,下面几行

int x = 0;

以下是有关extern的更多信息的链接 - > http://en.cppreference.com/w/cpp/language/storage_duration

  

extern说明符仅允许在变量声明中使用   和函数(类成员或函数参数除外)。它   指定外部链接,并且在技术上不会影响存储   持续时间,但不能用于自动定义   存储持续时间对象,因此所有extern对象都有静态或线程   持续时间。 另外,使用extern和的变量声明   没有初始化程序不是定义

答案 2 :(得分:2)

"的extern"意思是:"这个变量来自其他地方。它没有在这里宣布;此声明只是提示它是一个有效的名称。"

所以本质上这个代码是:

extern int x;
// This is a valid name, but the variable will be defined "externally", eg, somewhere else.

[...] 

int x=0;
// OH!  Here is where the definition is.  Now we know where that "extern" variable came from.
// And we know that it starts with value 0.

并且extern和定义出现在同一个文件中有点不寻常。

更典型的情况是,定义位于一个.C文件中,而extern位于不同的.C中,在构建过程中会链接在一起。

相关问题