当我只是检查哪些链接被授予外部局部变量时,
我发现编译器之间存在一些不同的行为
例如,如果我测试了下面的代码,
如您在comment变量中看到的那样,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 ++:“ 100 10 10”
- clang ++:“ 100 100 100”(msvc ++)
从结果中可以看到,如果有两个以上的嵌套块,
g ++只会授予变量的外部链接
我可以在标准中找到相关的词组,
但仍不清楚,因为编译器的行为不同
(https://eel.is/c++draft/basic.link#6)
恐怕我的英语不好,所以我无法正确
理解它。如果有人知道哪个编译器很好地符合标准
,并且可能的话,有人可以详细说明该标准对我说的是什么?
IMO阻止与外部连接的实体范围内声明是邪恶和语言将与禁止他们更好
—
MM
@MM:模块单位可以这样做!
—
戴维斯鲱鱼
f()
功能的示例,并且最里面extern void f()
具有内部链接-var
在这里也应该具有内部链接,因为它指的是相同的“实体”。