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

時間 2021-06-03 11:19:11

1樓:藍色

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

intglobal

;template

T>void

foo(Tt

){}void

bar(

int)

{}int

main

(void

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

在C 中,定義變數時直接初始化與先定義,後賦值在時間複雜度上有區別嗎?

Ivony 1 對於編譯器而言,在同乙個作用域中變數宣告位置對編譯結果沒有影響,變數只要在使用前被宣告即可。2 這個問題和時間複雜度一毛錢關係都沒有。 alphonsez 如果是簡單型別,比如int等,那麼定義的時候沒有初始值,那麼只是在stack上分配空間,並沒有額外初始化動作。然後再賦值就會把值...

C 物件的初始化問題?

Sunchy321 Otherwise i.e.for the remaining copy initialization cases user dened conversion sequences that can convert from the source type to the desti...

C 的類成員初始化 定義的時候寫 寫在初始化列表裡 寫在建構函式函式體中 有什麼區別?

jencol teng 首先,初始化順序是按照宣告順序初始化。其次,C 11之後,允許直接在類中初始化變數,C 11之前只有部分編譯器允許。其初始化效率和初始化列表一樣。重點 如果變數放在初始化列表,那麼在類初始化的時候,直接呼叫帶引數的建構函式初始化,而不是使用預設建構函式初始化。來乙個例子 cl...