我有以下代码段 main.c,下面是文件 somefile.h
#include "somefile.h"
extern int var = 10000;
int main()
{
cout << var << endl;
return 0;
}
和 somefile.h 包含
int var;
我的问题是,当我执行这段代码时,它会产生输出 10000,但为什么这不是重定义错误。因为我假设 extern int var = 10000;
是定义。现在,如果我在 somefile.h 中为 var
分配了一些值,它会给我一个错误,提示重新定义是预期的。我正在使用 VS 2010。
最佳答案
这个问题被标记为 C 和 C++,但它们是不同的语言。我的答案是关于 C。
如果您的代码在文件范围内包含序列 int var;/* ... */int var = 10000;
那么这在 C 中是合法的。
int var;
行称为暂定定义,它有点像函数的前向声明,但它是针对变量的。如果变量有后续定义,则该定义将取代它;否则暂定定义计数并且变量将被初始化为 0
。
您的 extern
关键字没有任何区别,因为在文件范围内定义的变量无论如何都是 extern
除非您专门使用 static
关键字。
但是,如果您添加了第二个翻译单元include
s somefile.h,则行为未定义。这是因为两个不同的翻译单元都定义了变量var
。您的链接器可能会对此进行诊断,但 C 标准并不要求它这样做。
如果您为 somefile.h 中的行提供初始值设定项,例如int var = 5000;
那么这是编译器必须诊断的多重定义错误。
关于c++ - 具有多个定义时 extern 关键字没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22398697/