Re: [問題] 全域變數在C/C++的初始化
看板C_and_CPP (C/C++)作者descent (「雄辯是銀,沉默是金」)時間10年前 (2015/12/27 20:54)推噓7(7推 0噓 2→)留言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
12/28 10:24, 4F
推
12/28 11:22, , 5F
12/28 11:22, 5F
→
12/28 11:22, , 6F
12/28 11:22, 6F
推
12/28 11:29, , 7F
12/28 11:29, 7F
→
12/28 11:29, , 8F
12/28 11:29, 8F
推
12/28 12:52, , 9F
12/28 12:52, 9F
※ 編輯: descent (180.217.224.76), 12/29/2015 22:35:30
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章