考慮在標頭中定義的類成員函數的情況,其中存儲變量爲static
。當您將標題包含在多個編譯單元中時,最終會得到static
變量的多個副本。但是,the compiler will fix this for you,只需選擇其中一個發出的變量(請注意,這與內聯不同)。這可以通過GNU特定的擴展來實現,可能的符號類型爲gnu_unique_object
(它們在nm
中顯示爲「u」,在手冊頁中將它們稱爲「唯一全局符號」)。手動創建gnu_unique_object符號
問題是,你如何強制編譯器爲任意變量生成這種符號?我厭倦了在課堂中包裝東西來獲得這種行爲。
您提供的鏈接描述了具有用於加載模塊(又名共享庫)被具體實現的行爲。它是你打算使用你的靜態變量的上下文嗎?你講的是多個編譯單元,但不是多個共享庫。如果沒有,那麼你肯定可以做得更簡單。請簡單告訴我們最後你對這些變量的期望行爲是什麼。 – dim
@dim它可能已經實現了共享庫,但gcc使用它來實現我描述的行爲。 –
好,但我仍然不明白:當你說「一個類頭成員函數定義在一個靜態存儲變量頭」。你的意思是「一個靜態存儲定義的變量,在某個類的成員函數體內聲明」?或者一個包含「成員函數」和「具有靜態存儲的成員變量」的類? – dim