2010-10-08 57 views
1

這是我長時間咆哮後的一個新問題。這裏的問題是,我的主應用程序中有一個全局的vector<Base*> vObjs,我在每個鏈接到應用程序的static lib中獲得了Derived obj s。如果我指定vObjs的init_priority爲101,並且每個obj在靜態庫中的含義爲...... 1000,是否保證vObjs將在靜態庫中獲得在obj之前調用的構造函數?謝謝你的幫助。靜態庫中變量的init_priority屬性

回答

2

讓我回應你可能想要重新考慮使用全局變量的其他答案。然而,一個可能的(我肯定仍然存在漏洞)至少可以消除對init優先級的需求。

而不是使用全球vector,您創建一個函數返回對靜態本地的引用。 C++規則確保函數static local始終在第一次使用時最初被初始化,所以您不必擔心vector未被初始化。

vector<LibInfo*>& get_gvLibInfo() 
{ 
    vector<LibInfo*> gvLibInfo; 
    return gvLibInfo; 
} 

您的註冊看起來像:

vector<LibInfo*>& get_gvLibInfo(); 

void reglib() 
{ 
    get_gvLibInfo().push_back(this); 
} 
+0

謝謝。我打算使用__attribute __((init_priority())),但這種方法看起來好一些。 – nakiya 2010-10-08 15:46:11

0

如果您使用的是GNU C++,它們似乎可以保證初始化的順序(click here)。但是我應該注意,如果你真的依賴初始化的順序,那麼你的設計是脆弱的。當你不關心訂單時,更好地尋找替代品。 HTH

+2

實際上,該值越高,傳遞給'init_priority',低優先級有。 – nakiya 2010-10-08 10:18:19

+0

@nakiya:我的壞,編輯 – 2010-10-08 10:23:11

1

Global Variables已被considered harmful替換爲nearly forty years,但人們仍然堅持使用它們。爲什麼?

reconsider your design,因爲它很脆弱,並會在未來很多年內提供a maintenance headache

+0

http://stackoverflow.com/questions/3880380/static-lib-loading-related-problem-please-help 這就是爲什麼我需要一個全局變量。 – nakiya 2010-10-08 10:30:14

+1

更正,這就是爲什麼*你認爲*你需要一個全局變量。 – Johnsyweb 2010-10-08 13:27:49