2013-06-12 2 views
3

gcc 이름 맹 글링 규칙에 대한 이해를 돕는 사람이 있습니까?글로벌 const 변수의 G ++ 이름 맹 글링

는 다음 테스트 코드를 고려

#include <stdio.h> 

const int x = 42; 
int y = 42; 

int main(int argc, const char* argv[]) 
{ 
     return 0; 
} 

나는 다음 (놀라운?) 결과를 얻을 수 nm을 실행 :

0000000000000000 T main 
0000000000000000 D y 
0000000000000000 r _ZL1x 

이 컴파일러에만 읽기 전용에 배치 전역 변수를 엉망으로 보여줍니다 섹션. 컴파일러에서 전역 변수를 모두 또는 전역으로 변경하려고합니다.

이것은 의도 한 동작입니까? 나를 위해 그것이 모순 보인다.

+5

C 또는 C++로 컴파일 하시겠습니까? 또한'x'는 암시 적으로'static' (적어도 C++에서는) 인 반면,'y'는 암묵적으로'static'입니다. – Angew

+1

암시 적으로'정적'은 정말로? 즉, 두 개의 다른 컴파일 단위에서 'x'의 보이는 주소가 다를 것입니다. 와우. 알아 둘만한. 다행히도 C는 이와 같은 게임을하지 않습니다. –

+0

나는 C++로 컴파일 중임 –

답변

3

맹 글링은 달리 합리적으로 충돌 할 링커 심볼을 구분하는 데 주로 사용됩니다.

x은 암시 적으로 정적이기 때문에 여러 번역 단위는 합법적으로 x이라고하는 다른 변수를 가질 수 있으므로 충돌을 피하기 위해 기호가 맹 글링됩니다. y 이후

하지 정적 프로그램에서 y라는 단 하나의 전역 변수가 될 수 , 그래서 (그들은 하나 ODR 위반으로 플래그 또는 링커에 의해 중복 제거한다) 충돌을 방지 할 필요가 없습니다.

다른 용도는 동일한 이름이지만 다른 인수 목록을 사용하여 오버로드를 구별하는 기능입니다. 그건 분명히 여기에 적용되지 않습니다.

+1

두 가지 요약하면 다음과 같습니다. 전역 const 변수는 암시 적으로 정적이며 파일 범위의 정적 변수 만 맹 글링됩니다. C++에서 정적 변수가 왜 왜곡 될 필요성을 알지 못합니다. C없이 처리 할 수 ​​있습니다!? 그래서 나를 위해서 그것은 암묵적으로 정적 인 글로벌 const 변수의 문제를 숨기는 부작용 일뿐입니다. 이 문제를 해결하려면 전역 적으로 표시 할 수 있도록 extern을 명시 적으로 정의해야합니다. –

관련 문제