我有一個宏,我用它來向註冊表映射添加鍵值。 (假設AddToMap位於全局靜態對象上,並在其他地方定義了一些其他對象。) 在定義了不同的類(某種類的註冊表)之後,在代碼中的各個位置調用AddKey宏。代碼分爲許多具有複雜依賴性的.h和.cc文件。C++類的靜態函數成員中的靜態數據成員初始化順序
我有下面這段代碼的工作原理:
#define AddKey(key, val)\
namespace NSP_##key {\
class A {\
public:\
static bool foo() {\
static bool dummy = AddToMap(#key, #val);\
}\
};\
static bool dummy_A = A::foo();\
}
`
我想知道的是如何創建和初始化靜態變量假人。當我使用GDB時,我發現這個A :: add在main或main之前被調用,如果被調用。這是對靜態變量的期望。
但是,如果我從類更改爲函數,則代碼似乎沒有工作了,並抱怨說,「密鑰已經被添加」
#define AddKey(key, val)\
namespace NS_##key {\
static bool A_foo() {\
static bool dummy = AddToMap(#key, #val);\
}\
static bool dummy_A = A_foo();\
}
我明白dummy_A必須是靜態的,因爲一C++中的定義規則和A_foo()的相同原因。但爲什麼靜態函數中的靜態變量虛擬行爲與靜態類中的靜態成員時不同?
你在頭文件擴展'AddKey'? – aschepler
是的。有一個在cc文件中擴展的GetValue,AddKey在頭文件中展開。 –