2010-03-28 47 views
1

我有一個全局的函數指針列表。這個列表應該在啓動時填充。順序並不重要,並且不存在會使靜態初始化複雜化的依賴關係。爲了實現這一點,我寫了一個類,在其構造函數中爲此列表添加單個條目,並在必要時通過宏分散此類的全局實例。這種方法的主要目標之一是不需要從外部顯式引用該類的每個實例,而是允許每個需要在列表中註冊某些內容的文件獨立執行。很好,很乾淨。如何在靜態鏈接庫中強制構建全局對象? [MSVC9]

但是,將這些對象放置在靜態庫中時,鏈接器會放棄(或者說從不鏈接)這些單元,因爲它們中沒有代碼被明確引用。明確提到編制單位中的符號會起反作用,直接抵觸該方法的主要目標之一。出於同樣的原因,/ INCLUDE不是一個可接受的選項,和/ OPT:NOREF實際上並沒有涉及到這個問題。

Metrowerks對它有一個__declspec指令,GCC有-force_load,但我找不到MSVC的任何等價物。

回答

0

如果你不想#include任何東西,那麼這是行不通的,但如果你能忍受這一點,一個常用的技術是使用nifty-counter來調用一個函數在main函數之前聲明的cpp文件中,然後將初始化所述文件中的任何靜態對象。

我已經在有許多應該進入工廠的對象的項目中使用過這個。我們必須有一個文件,每個頭文件聲明一個類,該類必須在工廠註冊。這是合理可行的恕我直言,因爲我非常喜歡編寫源文件,而不是設置各種鏈接器/編譯器選項。

另一種方法(這似乎並不通過靜態庫工作,看評論)可能會宣佈一些爲__declspec(dllexport),這將迫使其列入(可執行文件中太__declspec工作)。

+0

那麼,主要目的就是要避免必須在它所在的文件之外的任何地方引用全局對象。如果有幫助,這是一個單元測試框架;我討論的是從同一地點的多個庫中引用每個單元測試的想法,並且隨着單元測試數量的增長,它的縮放效果非常差。 不幸的是,__declspec(dllexport)不做任何事情,因爲這是一個靜態庫,而不是DLL。 – 2010-03-28 11:35:31

+0

謝謝澄清。嗯。我認爲__declspec會在lib被包含到由OS加載的實際模塊(dll/exe)中時發揮作用,但顯然我錯了。 – Macke 2010-03-28 11:45:55

0

我想你想要一個#pragma optimize("", off)#pragma optimize("", on)圍繞這些變量聲明。這將關閉丟棄它們的優化。

還記得預處理指令不能是宏的一部分。 __pragma可以用於某些事情(並且專門用於宏),但不是所有的,語法有些不同。不知道它是否適用於優化。

相關問題