C中未初始化的全局變數是弱符號,這句話對嗎?
gcc -c simple.c -o simple.oreadelf -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&
bar(47);
printf("%d
",global);
return 0;
}
在這裡,你可以觀察global的Ndx和Bind, foo, bar的Bind,
推薦閱讀:
※C「帶壞了」多少程序語言的設計?
※如何高效的學習C++?
※有哪些能炫技的代碼寫法?
※如何寫優美的c++代碼?
※為什麼C/C++相同內存布局的struct不能互相cast?