2011-02-12 75 views
2

當使用宏聲明一些全局變量時,我遇到了一個問題。這裏的例子:在C++的頭文件中使用宏聲明變量是否正確?

的原代碼:

/* some_config.h */ 
static const std::string KEYWORDS_A[] = {"AXX", "AYY"}; 
static const std::vector<std::string> KEYWORDS_A_VEC(KEYWORDS_A, KEYWORDS_A + sizeof(KEYWORDS_A)/sizeof(KEYWORDS_A[0])); 
static const std::string KEYWORDS_B[] = {"BXX", "BYY"}; 
static const std::vector<std::string> KEYWORDS_B_VEC(KEYWORDS_B, KEYWORDS_B + sizeof(KEYWORDS_B)/sizeof(KEYWORDS_B[0])); 

當前代碼:

/* some_config.h */ 
#define REGISTER_VEC(NAME) \ 
static const std::vector<std::string> KEYWORDS_##NAME_VEC(KEYWORDS_##NAME, KEYWORDS_##NAME + sizeof(KEYWORDS_##NAME)/sizeof(KEYWORDS_##NAME[0])) 
static const std::string KEYWORDS_A[] = {"AXX", "AYY"}; 
REGISTER_VEC(A); 
static const std::string KEYWORDS_B[] = {"BXX", "BYY"}; 
REGISTER_VEC(B); 

的some_config.h被列入some.cpp其中變量KEYWORDS_A_VEC和KEYWORDS_B_VEC被使用。但是,對於當前代碼,g ++編譯器會給出找不到KEYWORDS_A_VEC和KEYWORDS_A_VEC定義的​​錯誤。
代碼有問題嗎?謝謝你的幫助。

+0

我認爲這與預處理器如何遞歸填充宏展開中出現的宏有關。我對這個主題知之甚少,因此我將把它交給另一位C++專家來幫助解決這個問題。 – templatetypedef 2011-02-12 11:02:54

回答

3

,因爲你需要在每一個地方,一個符號化的東西,你打算來標記,例如你的編譯問題引起的:(對NAME雙方注意使用##

#define REGISTER_NAME(NAME) blah_##NAME##_blah 

至於這是否是好的做法,我會說不。你有一個單一的宏實例化多個變量,這會讓你的代碼讀者感到困惑。許多IDE和調試器會被這類事情弄糊塗,這意味着讀者將不得不做大量的手工搜索來確定哪些變量是神奇地被聲明的。

+2

不要忘記,當你從宏中混淆錯誤信息時,g ++ -E是你的朋友 - 它通過預處理器觸發它,讓你看到編譯器在那個時候看到了什麼 – Petesh 2011-02-12 11:10:32