问题描述
B.cpp
#include <iostream>
static int x=4;
void print_x() { std::cout<< x; }
A.cpp
#include <iostream>
void print_x(); //forward declaration
int x=3;
int main ()
{
std::cout<< x << " ";
print_x();
}
// output 3 4
我在Visual Studio 2019中运行此代码,但得到了此输出,但是我期望找到链接错误,因为当函数get_x()被执行时,链接器将看到两个定义,第一个是B中的静态x。 cpp,第二个是A.cpp中的x,因为它具有外部链接
那么为什么这段代码可以正确运行?
解决方法
静态变量未与其他翻译单元(内部链接)共享,因此与A.cpp中定义的全局变量不同。
对于链接程序,将维护ODR约束。这个post也可能对您有帮助。