#include <stdio.h>
namespace myname{
double var = 42;
}
extern "C" double _ZN6myname3varE = 10.0;
int main(){
printf("%d\n", _ZN6myname3varE);
return 0;
}
gcc
컴파일 결과는 다음과 같습니다gcc 내부 기호 장식에 어떤 문제가 있습니까?
[email protected]:~/workspace/vi_edit$ g++ testSymble.cpp -o testSymble
testSymble.cpp:7:19: warning: ‘_ZN6myname3varE’ initialized and declared ‘extern’ [enabled by default]
testSymble.cpp: In function ‘int main()’:
testSymble.cpp:10:32: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat]
/tmp/cczIjRfH.s: Assembler messages:
/tmp/cczIjRfH.s:14: Error: symbol `_ZN6myname3varE' is already defined
왜 _ZN6myname3varE
재정의?
경고 ‘_ZN6myname3varE’ initialized and declared ‘extern’ [enabled by default]
은 무엇을 의미합니까? 명시 적으로이 조항에 의해 허용 된 다른 것보다
프로그램이 선언하거나이 예약되어 문맥에 이름을 정의하는 경우
는 동작은 정의되지 않습니다.17.4.3.1.2 글로벌 이름
이중 밑줄을 포함 (_ _) 또는 대문자 편지 (2.11) 다음에 밑줄로 시작 각각의 이름은 여러 용도로 구현에 예약되어 있습니다.
'_Zxyz ...'와 같이 대문자가 뒤에 오는 기호 이름은 구현 (즉, 컴파일러 도구 체인)에서 사용하도록 예약되어 있습니다. 그러한 심볼을 선언하거나 정의하는 것만으로 * 정의되지 않은 동작 * (C99 §7.1.3/1-2, C++ 03 §17.4.3.1/1, §17.4.3.1.2)이됩니다. –