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


12

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 )

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


1
관련 stackoverflow.com/questions/41978949/… gcc 버그라고 생각합니다. 표준은 f()기능 이 포함 된 예제를 제공하고 가장 안쪽 extern void f()에는 내부 연결 var이 있습니다. 동일한 "엔티티"를 참조하기 때문에 내부 연결도 여기에 있어야합니다.
KamilCuk

외부 연계가있는 엔티티의 IMO 블록 범위 선언은 사악하며이를 금지하면 언어가 더 나을 것입니다.
MM

@MM : 모듈 단위가 그렇게합니다!
Davis Herring

답변:


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.