2016-04-27 160 views
2

考慮在標頭中定義的類成員函數的情況,其中存儲變量爲static。當您將標題包含在多個編譯單元中時,最終會得到static變量的多個副本。但是,the compiler will fix this for you,只需選擇其中一個發出的變量(請注意,這與內聯不同)。這可以通過GNU特定的擴展來實現,可能的符號類型爲gnu_unique_object(它們在nm中顯示爲「u」,在手冊頁中將它們稱爲「唯一全局符號」)。手動創建gnu_unique_object符號

問題是,你如何強制編譯器爲任意變量生成這種符號?我厭倦了在課堂中包裝東西來獲得這種行爲。

+0

您提供的鏈接描述了具有用於加載模塊(又名共享庫)被具體實現的行爲。它是你打算使用你的靜態變量的上下文嗎?你講的是多個編譯單元,但不是多個共享庫。如果沒有,那麼你肯定可以做得更簡單。請簡單告訴我們最後你對這些變量的期望行爲是什麼。 – dim

+0

@dim它可能已經實現了共享庫,但gcc使用它來實現我描述的行爲。 –

+0

好,但我仍然不明白:當你說「一個類頭成員函數定義在一個靜態存儲變量頭」。你的意思是「一個靜態存儲定義的變量,在某個類的成員函數體內聲明」?或者一個包含「成員函數」和「具有靜態存儲的成員變量」的類? – dim

回答

0

如果您在頭文件中聲明全局變量,那麼您將在每個編譯單元中獲得該變量的不同實例。 extern關鍵字就是你所追求的。這個關鍵字使得看起來像一個實例化成一個前向聲明。它可以被認爲是一個承諾,該名稱的變量在不同的編譯單元中被實例化,並且在鏈接時可以找到。

MyTrueGlobals.h

extern int global_variable_1; 

MyTrueGlobals.cpp

int global_variable_1 = 0; 
+0

這正是我想要避免的,*它可以*避免,通過做我在問題中描述。 –

+0

你在避免什麼?必須有一個cpp文件?這裏沒有人似乎理解你的問題,包括我自己在內。上面@ dim的評論可能是你最好的選擇,'inline'關鍵字的行爲似乎是你以後的行爲,但它只能應用於函數(據我所知)。 – Jfevold