我正在用C++ 11編寫一個小內核,並且有兩個相同類型的實例必須在創建任何其他靜態對象之前構建。控制靜態對象的構造函數的順序
我寫的代碼如下:
// test.hpp
class test {
// blahblah...
};
// test.cpp
typedef char fake_inst[sizeof(test)] __attribute__((aligned(alignof(test))));
fake_inst inst1;
fake_inst inst2;
// main.cpp
extern test inst1;
extern test inst2;
int kmain() {
// copy data section
// initialize bss section
new (&inst1) test();
new (&inst2) test();
// call constructors in .init_array
// kernel stuffs
}
它建立並如預期沒有任何警告信息,但不能與LTO工作。
我得到了大量的警告消息,抱怨類型匹配,我不知道是否有一個解決方法,因爲它混淆我找到其他'真正'的警告或錯誤消息。
有什麼建議嗎?
你究竟在做什麼?在下面對Pubby的回答的評論中,你說你想要初始化幾個相同類型的對象。對我來說,在讓實現調用其他構造函數之前,你似乎想要初始化與C++支持相關的結構,比如堆。但是,這聽起來不像你想要的。另外,你會得到什麼樣的「類型匹配」警告? – Potatoswatter 2012-03-17 09:24:52
@Potatoswatter很多警告:'xxx'類型與原始聲明[默認啓用]不匹配。這是因爲實際類型不是測試,而是char []。我以爲我可以禁用靜態構造函數,但似乎沒有辦法做到這一點。 – kukyakya 2012-03-17 10:37:36
啊,我明白了。你應該做的是'char fake_inst1 [sizeof(test)]; test * const inst1 = reinterpet_cast < test * >(fake_inst1);' – Potatoswatter 2012-03-17 11:44:57