Re: [問題] 全域變數在C/C++的初始化

作者: descent (「雄辯是銀,沉默是金」)   2015-12-27 20:54:00
c++ 可以這麼做是因為插入了某一段程式碼,
並在某個時候去執行這段程式碼,
所以可以這麼做是要付出某些代價的。
global object 就是用這樣的方式喚起 ctor。
想知道整個詳細的過程可以看看這篇:
http://descent-incoming.blogspot.tw/2012/09/c-c-global-variable-initialize.html
如果你有興趣這個技術, 可以參考這幾篇文章:
http://descent-incoming.blogspot.tw/2015/12/c-runtime-article-content.html
用個簡單的說法:
c++ 會插入一個 function global_a
global_a 會去作 b=a 這件事情。
而 c++ runtime library 會有一段程式碼去呼叫 global_a()
這就是 c++ 可以做到而 c 做不到的祕密。
也就是 c++ 被人家詬病總是在程式員不知道的地方插入很多程式碼,
是個黑箱。
※ 引述《NaiveRed (天真紅)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: Dev c++,VS
: 問題(Question):
: 一開始是遇到了這個問題
: int a = 10;
: int b = a;
: int main(){return 0;}
: 在C是不行的,錯誤訊息: initializer element is not constant
: C++則沒問題
: 所以我改成
: const int a = 10;
: int b = a;
: int main(){return 0;}
: 依舊是不行
: 查了一下知道了大概的理由,但還是有點不知所以
: 看完後的理解是:
: C在初始化全域變數時需要constant expressions,因為他是存在Data segment
: 然後在C++初始化全域變數時則不需要
: 至於加了const後還是不行則是因為在C裡不算是標準的constant expressions
: 他需要compile-time constant(全域變數是在compile time初始化的)
: (以上是從stackoverflow不同回答拼湊出來的想法
: 不知道有沒有哪裡理解錯?或是能幫我多做補充的
: 謝謝!
作者: NaiveRed (天真紅)   2015-12-27 22:09:00
感謝你的簡單說法和文章!
作者: grayStone (灰色石頭)   2015-12-28 03:09:00
推黑箱
作者: RealJack   2015-12-28 09:37:00
果然魔鬼藏在細節
作者: fr3ak (fr3@K)   2015-12-28 10:24:00
黑箱的意思是 spec 裡面沒有提到對吧? 先說我懶得翻 (逃~)平衡一下. 印象中 pre11 的 spec 似乎對 global/static 著墨較少. 但自 11 開始就有顯著的改善 (還是沒翻 spec QQ)年紀大了, 有時些時候資訊來源是 spec, CPPOM 或是早期 implementer 的實做記不是那麼清楚 T_T
作者: descent (「雄辯是銀,沉默是金」)   2015-12-28 12:52:00
這是 gcc 的實作方式, 不同 compiler 也許有不同的方法

Links booklink

Contact Us: admin [ a t ] ucptt.com