我用g ++和clang ++编译该程序。有一个区别:
g ++打印1,而clang ++打印2。
似乎
g ++:extern变量在最短范围内定义。
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;
}
}
other.cpp
int i;
版本:g ++:7.4.0 / clang ++:10.0.0
编译:$(CXX)main.cpp other.cpp -o extern.exe
4
编译器对extern不做任何事情,只是将它们标记为具有外部引用的变量,而链接器将尝试解析所有已编译目标文件之间的链接。
—
SPlatten
一个很好的(如果很奇怪)的问题!在
—
Adrian Mole
MSVC
和中clang-cl
(都给定2
)使用您的代码,似乎extern int i
两者都完全忽略了:即使我没有链接other.cpp
文件,该程序也会生成并运行。
@SPlatten大概是因为链接器不需要“解析”对的引用
—
Adrian Mole
i
,所以它不会尝试。