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

看板C_and_CPP (C/C++)作者 (「雄辯是銀,沉默是金」)時間10年前 (2015/12/27 20:54), 10年前編輯推噓7(702)
留言9則, 5人參與, 最新討論串2/2 (看更多)
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

12/27 22:09, , 1F
感謝你的簡單說法和文章!
12/27 22:09, 1F

12/28 03:09, , 2F
推黑箱
12/28 03:09, 2F

12/28 09:37, , 3F
果然魔鬼藏在細節
12/28 09:37, 3F

12/28 10:24, , 4F
黑箱的意思是 spec 裡面沒有提到對吧? 先說我懶得翻 (逃~)
12/28 10:24, 4F

12/28 11:22, , 5F
平衡一下. 印象中 pre11 的 spec 似乎對 global/static 著
12/28 11:22, 5F

12/28 11:22, , 6F
墨較少. 但自 11 開始就有顯著的改善 (還是沒翻 spec QQ)
12/28 11:22, 6F

12/28 11:29, , 7F
年紀大了, 有時些時候資訊來源是 spec, CPPOM 或是早期 imp
12/28 11:29, 7F

12/28 11:29, , 8F
lementer 的實做記不是那麼清楚 T_T
12/28 11:29, 8F

12/28 12:52, , 9F
這是 gcc 的實作方式, 不同 compiler 也許有不同的方法
12/28 12:52, 9F
※ 編輯: descent (180.217.224.76), 12/29/2015 22:35:30
文章代碼(AID): #1MVzzkqA (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1MVzzkqA (C_and_CPP)