【发布时间】:2014-08-20 04:43:27
【问题描述】:
我在 C 语言中使用过很多 X 宏,但在使用 C++ 和 Qt 时似乎遇到了问题。我正在使用 X-macro 将一些名称与几个项目中的一些字符串同步。在一个项目中,我只需要生成一个“const char* const NAME = STRING;”值和对“.h”文件中该常量的外部引用:“extern const char* const NAME;”。编译项目时,我得到一个未定义的对我的 NAME 的引用。这就是我在“XML_Keywords.h”文件中定义 X 宏的内容。
#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)
我在需要的其他 .cpp 文件中包含“Keywords.h”,但我不断收到 UNIT_NAME_STR、UNIT_CODE_STR 和 UNIT_HDWR_ID 的未定义引用。我无法追踪我的错误。谢谢。
【问题讨论】:
-
如果您输入您希望宏直接扩展的内容,它会链接吗?
-
检查你是否真的在编译和链接
Keywords.cpp。也许它根本没有添加到您的构建中。 -
@chris,是的,我有明确的定义要开始。在另一个项目中,我需要相同的枚举和字符串列表对。
-
Igor,是的,这是我的 .pro 文件,正在编译和链接
-
好的,我回去把它改回显式定义,但它仍然坏了,所以不知何故我坏了别的东西。我需要找到那个。抱歉,在我开始更改宏之前它起作用了。谢谢。