2010-09-19 196 views
5

我想設計僅頭部庫,不幸的是需要具有全局靜態變量(無論是在類中,還是在命名空間中)。C++靜態變量

是否有任何方法或首選解決方案具有全局靜態變量,同時僅維護頭部設計?

的代碼是here

回答

10

有幾個選項。即來到我的腦海裏的第一件事是,C++允許類模板的靜態數據成員在一個以上的翻譯單位來定義:

template<class T> 
struct dummy { 
    static int my_global; 
}; 

template<class T> 
int dummy<T>::my_global; 

inline int& my_global() {return dummy<void>::my_global;} 

連接器將多個定義合併成一個。但是inline獨自也能在這裏幫助和這個解決方案要簡單得多:

inline int& my_global() { 
    static int g = 24; 
    return g; 
} 

你可以把這個內聯函數成一個頭文件並將其包含到許多翻譯單元。 C++保證這個內聯函數返回的引用將始終引用同一個對象。確保該功能具有外部鏈接。

+2

+1本地靜態是全局數據最簡單的方法,尤其是因爲新的C++ 0x標準即使在多線程應用程序中也能保證它們的正確初始化。 – 2010-09-19 18:52:48

+0

我還應該補充說第二個變體有一個缺點 - g僅在my_global的第一次調用時被初始化。因此,編譯器會在每個調用中插入比較,跳轉和線程警衛 - 這會使調用變慢(這對於庫入口點可能很重要)。 – 2015-02-20 19:43:34

+0

@AlexEngy:在這種情況下,它是一個int,它可能在靜態初始化時沒有動態初始化中的線程安全開銷。 – sellibitze 2015-02-20 23:21:49