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 )
어떤 영어가
표준을 잘 준수
하고 있는지, 가능한 경우 표준이 정확히 무엇을 말하는지를 정교하게 생각할 수 있습니까?
외부 연계가있는 엔티티의 IMO 블록 범위 선언은 사악하며이를 금지하면 언어가 더 나을 것입니다.
—
MM
@MM : 모듈 단위가 그렇게합니다!
—
Davis Herring
f()
기능 이 포함 된 예제를 제공하고 가장 안쪽extern void f()
에는 내부 연결var
이 있습니다. 동일한 "엔티티"를 참조하기 때문에 내부 연결도 여기에 있어야합니다.