我在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的未定义引用。我无法追查我的错误。谢谢。
答案 0 :(得分:0)
好的,对于其他任何C程序员但现在正在使用C ++的方法,处理常量的方式是非常不同的。我发现我的代码使用 keyword.cpp 文件中的显式 const 定义的原因是我还包含 keyword.h 文件在 keyword.cpp 文件中,该文件将这些常量定义为 extern 。当 h 文件未包含在 cpp 文件中时,即使使用常量的其他文件确实导入 h ,也不会导出常量文件。这与C完全不同。在阅读了更多内容之后,似乎应该将常量放在 h 文件中,并且根本不应该有 cpp 文件。