다른 블록에서 동일한 명명 된 extern 로컬 변수가 C ++에서 컴파일러간에 다른 연결을 얻는 이유는 무엇입니까?

extern 로컬 변수에 부여되는 연결을 확인하는 동안
컴파일러간에 다른 동작이 있음을 발견했습니다.

예를 들어
주석 변수에서 볼 수 있듯이 아래 코드 를 테스트 하면 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 ++ : “100100100”(msvc ++)

결과에서 알 수 있듯이 중첩 된 블록이 두 개 이상인 경우
g ++은 변수에 외부 연결을 부여합니다.

표준에서 관련 문구를 찾을 수
있지만 컴파일러마다 동작이 다르기 때문에 여전히 명확하지 않습니다
( https://eel.is/c++draft/basic.link#6 )

어떤 영어가
표준을 잘 준수
하고 있는지, 가능한 경우 표준이 정확히 무엇을 말하는지를 정교하게 생각할 수 있습니까?



답변

이것은 공개 문제 CWG1839 의 주제입니다 . 현재 의도 는 Clang 및 MSVC의 동작이 올바른 것입니다.


답변