我想要一個全局列表,當兼容類鏈接到可執行文件時,這些對象會自動填充。我已經想出了一種方法,但當'兼容類'被放入庫時它不起作用。使用函數從庫中返回一個靜態對象
該列表顯然應該在使用前初始化,所以我把它作爲一個函數的靜態變量。 例如,我有file1.cpp如下:
vector<int>& getGlobalReg() {
static vector<int> __globalReg;
return __globalReg;
}
頭file1.h定義訪問該FUNC:
vector<int>& getGlobalReg();
的對象(在這種情況下的整數)將被自動註冊由一個鏈接的file2.cpp例如如下:
class Compatible {
public:
Compatible() {
getGlobalReg().push_back(2);
}
};
Compatible __auto_reg;
當所有這一切聯繫在一起,一切都好。當將lib1和file2.cpp中的file1.cpp放入lib2(使用lib1)時,使用lib2的可執行文件會發現getGlobalReg()爲空。在g ++和MSVC 2013中觀察它。
這是在「全局列表」中自動註冊對象的正確方法嗎?它可以修改爲在建議的鏈接方案中工作,並且相應的鏈接規則在哪裏定義?
什麼樣的圖書館 –
如果您發佈MCVE,會更好。例如,也許'main()'發現'getGlobalReg()。empty()'true,因爲你從來沒有創建過一個Compatible對象。我們無法從您發佈的內容中對此進行說明。 –
您可以:file2.cpp的最後一行初始化Compatible類的靜態對象。一個MCVE可以通過添加一個main.cpp來構造,其中包含一個main.cpp int main(){0} {「全局對象列表的大小:」<< getGlobalReg()。size()<< endl; return 0; } – glebB