当我检查外部局部变量的链接时,我发现在不同的编译器之间有一些不同的行为。
例如,如果我测试了下面的代码,就像你在注释中所看到的那样,变量为 var
有不同的联系
// foo.cpp
int var = 10; // external linkage
// main.cpp
#include <iostream>
static int var = 100; // internal linkage
int main() {
extern int var; // internal linkage
std::cout << var << std::endl;
{
extern int var; // g++: external linkage , clang++: internal linkage
std::cout << var << std::endl;
{
extern int var; // g++: external linkage , clang++: internal linkage
std::cout << var << std::endl;
}
}
}
结果是
从结果中我可以看到,如果有两个以上的嵌套块,g++只是授予变量的外部链接权
我可以在标准中找到相关的短语,但它仍然不清楚,因为它的行为因编译器而异 (https:/eel.isc++draftbasic.link#6)
我怕我的英语不好,所以我不能正确地理解它,如果有人知道哪些编译器是符合标准的,如果可能的话,有人能为我详细说明标准的具体内容吗?
这是公开问题的主题 CWG1839. 目前 意图 是Clang和MSVC的行为是正确的。