为什么不同块中相同命名的extern局部变量在c ++中的编译器之间得到不同的链接?


12

当我只是检查哪些链接被授予外部局部变量时,
我发现编译器之间存在一些不同的行为

例如,如果我测试了下面的代码,
如您在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

恐怕我的英语不好,所以我无法正确
理解它。如果有人知道哪个编译器很好地符合标准
,并且可能的话,有人可以详细说明该标准对我说的是什么?


1
相关的stackoverflow.com/questions/41978949/…我相信这是一个gcc错误,标准给出了带有f()功能的示例,并且最里面extern void f()具有内部链接- var在这里也应该具有内部链接,因为它指的是相同的“实体”。
KamilCuk

IMO阻止与外部连接的实体范围内声明是邪恶和语言将与禁止他们更好
MM

@MM:模块单位可以这样做!
戴维斯鲱鱼

Answers:


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.