【问题标题】:X-macro Substitution in C++C++ 中的 X 宏替换
【发布时间】: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 文件,正在编译和链接
  • 好的,我回去把它改回显式定义,但它仍然坏了,所以不知何故我坏了别的东西。我需要找到那个。抱歉,在我开始更改宏之前它起作用了。谢谢。

标签: c++ qt macros


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2021-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多