推 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:例子中出現一沱組合語言還挺讓人失焦的 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