在C ++的头文件中使用宏声明变量是正确的吗?

时间:2011-02-12 11:00:25

标签: c++ macros

使用宏声明一些全局变量时遇到了问题。情况就是这样:

原始代码:

/* 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的定义。
代码有什么问题吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

您的编译问题是由于您需要在您想要标记的每个地方都需要一个标记化内容,例如:

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

(请注意在##两侧上使用NAME。)

至于这是否是好的做法,我会说不。您有一个宏实例化多个变量,这会让代码的读者感到困惑。许多IDE和调试器会被这种事情搞糊涂,这意味着读者必须进行大量的手动搜索才能找出变量被神奇地声明的地方。