外部变量 - 多个文件

问题描述

当我在另一个不同类型的文件中重新定义 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
}

解决方法

对于“仅链接”的回答很抱歉,但它说得很好。

One Definition Rule

odr 使用的每个非内联函数或变量的一个且只有一个定义(见下文)需要出现在整个程序中(包括任何标准和用户定义的库)。 编译器不需要诊断此违规,但未定义违反它的程序的行为。