標籤:

C中未初始化的全局變數是弱符號,這句話對嗎?

gcc -c simple.c -o simple.o

readelf -a simple.o

符號表如下:

weak_symbol 位於4 bss段

global_unint 卻是屬於common模塊的

c++ - Why uninitialized global variable is weak symbol?

stack overflow上的理解是否正確?

common模塊的作用


stackoverflow的這個理解很正確,而你這裡指明了C,在有關未初始化全局變數這裡,C和C++處理的確是不同的,就在於C++對於未初始化的全局變數會給一個默認值,如int類型的就是0,所以C++並非如C一樣將Ndx置於了COM。而你給出的stackoverflow已經指明了common symbol的作用了,說的很清楚了:

Common symbols are merged at link time so that they all refer to the same storage; if more than one object attempts to initialise such a symbol, you will get a link-time error. (If they aren"t explicitly initialised anywhere, they will be placed in the BSS, i.e. initialised to 0.)

其實,你可以看見,global_unint的BIND並非weak,也就是說「C中未初始化的全局變數是弱符號」這是不對的。

而有關弱符號,除了你自身綁定的__attribute__,在C++的確有用,那就是模板。

#include &
int global;
template &
void foo(T t) {}
void bar(int) {}
int main(void) {
foo&(47);
bar(47);
printf("%d
",global);
return 0;
}

在這裡,你可以觀察global的Ndx和Bind, foo, bar的Bind, :-)


推薦閱讀:

C「帶壞了」多少程序語言的設計?
如何高效的學習C++?
有哪些能炫技的代碼寫法?
如何寫優美的c++代碼?
為什麼C/C++相同內存布局的struct不能互相cast?

TAG:CC | 編譯器 |