看板 C_and_CPP 關於我們 聯絡資訊
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不同回答拼湊出來的想法 : 不知道有沒有哪裡理解錯?或是能幫我多做補充的 : 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.224.186 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1451220846.A.D0A.html
NaiveRed: 感謝你的簡單說法和文章! 12/27 22:09
grayStone: 推黑箱 12/28 03:09
RealJack: 果然魔鬼藏在細節 12/28 09:37
fr3ak: 黑箱的意思是 spec 裡面沒有提到對吧? 先說我懶得翻 (逃~) 12/28 10:24
fr3ak: 平衡一下. 印象中 pre11 的 spec 似乎對 global/static 著 12/28 11:22
fr3ak: 墨較少. 但自 11 開始就有顯著的改善 (還是沒翻 spec QQ) 12/28 11:22
fr3ak: 年紀大了, 有時些時候資訊來源是 spec, CPPOM 或是早期 imp 12/28 11:29
fr3ak: lementer 的實做記不是那麼清楚 T_T 12/28 11:29
descent: 這是 gcc 的實作方式, 不同 compiler 也許有不同的方法 12/28 12:52
※ 編輯: descent (180.217.224.76), 12/29/2015 22:35:30