读书人

gcc编译器符号内部修饰有关问题

发布时间: 2013-08-04 18:26:16 作者: rapoo

gcc编译器符号内部修饰问题
在看《程序员的自我修养》时,里面提到编译器会对符号进行内部修饰并给了下面一个例子,说是在gcc下输出是42,
但是我自己试了一下,根本编译通不过,因为var会被修饰成_ZN6myname3varE,在汇编时提示_ZN6myname3varE重定义:

引用
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

#include <stdio.h>


namespace myname{
double var = 42;
}

extern "C" double _ZN6myname3varE = 10.0;

int main(){
printf("%d\n", _ZN6myname3varE);
return 0;
}

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

另外, 要想看到结果是 42 的话, printf("%d\n" 改成 printf("%f\n"

var = 42是整数,为何要改成%f?改成%f的话应该输出10.000000


namespace myname{
double var = 42;
}

var 哪里是整数了....

我看错了。

把 = 10去掉有何影响?


有 = 10 的时候, 它是一个定义. 去掉后是一个声明.

读书人网 >C++

热点推荐