C ++中的X-macro替换

时间:2014-08-19 19:30:34

标签: c++ qt macros

我在C中使用了很多X-macros,但似乎在使用C ++和Qt时遇到了问题。我正在使用X-macro将一些名称与一些项目中的某些字符串同步。在一个项目中,我只需要生成一个" const char * const NAME = STRING;"值&在" .h"中对该常量的外部引用; file:" extern const char * const NAME;"。在编译项目时,我得到了对我的NAME的未定义引用。这就是我在我的" XML_Keywords.h"用于定义X-macros的文件。

#define SELECT_KEYWORD(a, b) a,                             
#define SELECT_STRING(a, b) b,                             
#define SELECT_GEN_CONST(KEY, STR) const char* const KEY = STR; 
#define SELECT_EXT_CONST(KEY, STR) extern const char* const KEY;

#define FOR_UNIT_KEYWORDS(apply)                              \
    apply(UNIT_NAME_STR, "UnitNameStr" )                      \
    apply(UNIT_CODE_STR, "UnitCodeStr" )                      \
    apply(UNIT_HDWR_ID,  "UnitHdwrID"  )                      

在我的" Keywords.cpp"我这样做是为了扩展成一系列" const char * const"声明。

#include "XML_Keywords.h" 

FOR_UNIT_KEYWORDS(SELECT_GEN_CONST)

在我的" Keywords.h"文件我这样做是为了扩展到我的外部定义。

#include "XML_Keywords.h" 

FOR_UNIT_KEYWORDS(SELECT_EXT_CONST)

我包含" Keywords.h"在我需要的其他.cpp文件中,但我不断获得UNIT_NAME_STR,UNIT_CODE_STR和UNIT_HDWR_ID的未定义引用。我无法追查我的错误。谢谢。

1 个答案:

答案 0 :(得分:0)

好的,对于其他任何C程序员但现在正在使用C ++的方法,处理常量的方式是非常不同的。我发现我的代码使用 keyword.cpp 文件中的显式 const 定义的原因是我还包含 keyword.h 文件在 keyword.cpp 文件中,该文件将这些常量定义为 extern 。当 h 文件未包含在 cpp 文件中时,即使使用常量的其他文件确实导入 h ,也不会导出常量文件。这与C完全不同。在阅读了更多内容之后,似乎应该将常量放在 h 文件中,并且根本不应该有 cpp 文件。