#include <stdio.h>
namespace myname{
double var = 42;
}
extern "C" double _ZN6myname3varE = 10.0;
int main(){
printf("%d\n", _ZN6myname3varE);
return 0;
}
gcc
コンパイル結果は次のとおりです。
Jim@ubuntu:~/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 つのアンダースコア (_ _) を含む名前、またはアンダースコアの後に大文字が続く名前 (2.11) は、実装用に予約されています。