当我在另一个不同类型的文件中重新定义 extern
变量时,VS 编译器没有给出错误消息。据我所知,它应该引发错误,因为它在另一个文件中被全局定义为 extern
。这种行为的原因是什么?
source1.cpp
extern int x;
source2.cpp
int x = 5;
test.cpp
#include <iostream>
double x = 455;
int main()
{
std::cout << x; // writes 455
}
答案 0 :(得分:3)
对于“仅链接”的回答很抱歉,但它说得很好。
<块引用>odr 使用的每个非内联函数或变量的一个且只有一个定义(见下文)需要出现在整个程序中(包括任何标准和用户定义的库)。 编译器不需要诊断此违规,但未定义违反它的程序的行为。