看板 C_and_CPP 關於我們 聯絡資訊
int addr; char *vb = (char*)(0xb8000+160 - addr); int cpp_main(void) { return 0; } 最近踩到這個地雷, 和大家討論一下。 這是 c 程式, 還是 c++ 程式呢?還是兩者都是, 我認為是 c++ 程式, 因為 c compiler 無法 compile 它。 由於整篇很長也有程式碼, 請參考 blog 文章, 和大家討論一下, 有什麼錯誤也歡迎指證: http://descent-incoming.blogspot.tw/2012/09/c-c-global-variable-initialize.html short: http://goo.gl/NKeKW -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.114.140.87
LPH66:我個人會對這種看似沒有恰當初始化的敘述當成地雷就是了... 09/23 22:08
LPH66:(我指的是 addr 變數 如果不是你的 blog 裡寫了還有其他 09/23 22:09
LPH66: class 的建構子要跑 我就當它是未初始化變數了...) 09/23 22:09
akasan:c++ 要保證 global ctor 的順序的話 放在 function local 09/23 22:12
akasan:static 為常見作法 09/23 22:12
akasan:http://ppt.cc/GefP 09/23 22:13
akasan:例子中出現一沱組合語言還挺讓人失焦的 09/23 22:15
loveme00835:__attribute__ init_priority 09/23 22:36
WPC001:int addr未設定初值,改正後,這程式應該是C/C++都能編譯吧 09/24 01:35
int addr 的初值是 0, 並不是未設定初值。 而把 int addr 改成 int addr=10; const int addr=10; 在我的環境下都是同樣的結果。 感謝 akasan: tool.cpp u8 *get_vb() { static u8 *vb = (u8*)(0xb8000+160 - load_addr); return vb; } 我用此方式解決 global object 相互引用的問題 (雖然 vb 看起來不像 global object)。 cppb.cpp Ab ab(2); extern "C" int cpp_main(void) // 這是我的 c++ 程式進入點 { } ab 會用到 tool.cpp vb。 而 __attribute__ init_priority extern u8 *vb __attribute__ ((init_priority (200))); 得到 tool.cpp:6: error: can only use ‘init_priority’ attribute on file-scope definitions of objects of class type 看來 g++ 好像不把 vb 當然 class 來看待。 ※ 編輯: descent 來自: 59.125.239.51 (09/24 08:57)
LPH66:我也知道它是 0 但如果 addr 只會是 0 的話我不會寫成這樣 09/24 22:20
LPH66:因此我才會說「當它是未初始化變數」 09/24 22:21
LPH66:除非寫成這樣有什麼特殊意義在... 09/24 22:21