c++中的x -宏替换

X-macro Substitution in C++

本文关键字:替换 中的 c++      更新时间:2023-10-16

我在C中使用了很多x -宏,但似乎在使用c++和Qt时出现了问题。我正在使用x -宏来同步一些名称与一些字符串在几个项目中。在一个项目中,我只需要生成一个"const char* const NAME = STRING;"值和一个在"。h"文件中对该常量的外部引用:"extern const char* const 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)

我包括"关键字。h"在我需要的其他。cpp文件,但我一直得到一个未定义的引用为UNIT_NAME_STR, UNIT_CODE_STR和UNIT_HDWR_ID。我找不到我的错误。谢谢。

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