我试图弄清楚如果在某些程序中我们会有这样的情况会发生什么:
extern int x;
void foo(){...}
void bar(){...}
void main(){
foo();
bar();
}
int x=0;
那么假设会发生什么?为什么允许两个具有相同名称的变量?它们是否不同?
答案 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
中,在构建过程中会链接在一起。