【发布时间】:2020-01-07 08:01:16
【问题描述】:
我用g++和clang++编译这个程序。有区别:
g++ 打印 1,但 clang++ 打印 2。
好像
g++:外部变量定义在最短范围内。
clang++:extern 变量定义在最短的全局范围内。
C++ 规范是否对此有任何规范?
main.cpp
#include <iostream>
static int i;
static int *p = &i;
int main() {
int i;
{
extern int i;
i = 1;
*p = 2;
std::cout << i << std::endl;
}
}
其他.cpp
int i;
版本:g++:7.4.0/ clang++:10.0.0
编译:$(CXX) main.cpp other.cpp -o extern.exe
【问题讨论】:
-
编译器不会对 extern 做任何事情,只是将它们标记为具有外部引用的变量,链接器试图解析所有编译目标文件之间的链接。
-
一个极好的(如果奇怪的话)问题!在
MSVC和clang-cl(都给出2)中玩弄你的代码,似乎extern int i被两者完全忽略:即使我没有链接到other.cpp文件,程序构建并运行。 -
@SPlatten 据推测,由于链接器不需要“解析”对
i的引用,它不会尝试。
标签: c++ language-lawyer c++17