繁体   English   中英

定义具有相同名称和值的符号字符串常量

[英]Defining symbolic string constants which have the same name and value

我遇到的情况是,我想使用一些可以象征性使用的字符串,即好像我声明了一个宏

#define kBlahProperty "kBlahProperty"
#define kFooProperty "kFooProperty"

我不能使用枚举的原因有多种(有关更多上下文,请参见前面的问题 ),例如在调试器中获取有用的信息,以可读格式序列化数据以及处理在不同源文件中定义的属性集。

典型用法:

setProperty(kBlahProperty, 6);
if (otherProperty==kBlahProperty) { doStuff(); }
std::cout << "property type: " << kBlahProperty;  // outputs "kBlahProperty" rather than an enum

这些属性可能很多,为了简化定义,我希望能够在一个地方这样声明它们:

DEFINE_PROPERTY(kBlahProperty)
DEFINE_PROPERTY(kFooProperty)

但是,我找不到定义本身可以扩展为#define的宏的方法(我已经尝试了一些使用'#'和'##'运算符的示例,但是要粘贴'#define'是问题)。

另一种方法是定义要扩展为char*的宏:

#define DEFINE_PROPERTY(propName) const char8* propName=#propName

但这有一个问题,即在每个编译单元中都定义了它,因此产生了链接器错误。 如果我将其更改为使用extern则无法将其定义为使用字符串本身-必须放在.cpp文件中,因此现在我需要在标头中声明所有这些属性,然后在cpp文件,因此您在两个位置都有一个列表。

因此,有没有一种好的方法来定义这些字符串,以便您只需声明一次即可? 我可以使用Boost预处理器,但只能访问C ++-0x的一小部分(因此无法使用类内常量初始化程序)。

您可以将宏定义为具有#ifdef,以便它具有两条路径-if和else。 然后在标头中仅声明您的propName。 然后,在.cpp文件中,定义一个预处理程序变量,然后再添加头文件。 该定义将使您的宏定义 propName。

简单(如果很丑)-仅在未定义另一个符号的情况下,才将宏定义为包括extern,并在包含头文件之前以一个完整的编译单元定义该符号

带示例(为清楚起见,省略了防护罩)

#ifdef IN_CPP
#define DEFINE_PROPERTY(propName) const char8* propName=#propName;
#else
#define DEFINE_PROPERTY(propName) extern const char8* propName;
#endif

仅在一个编译单元中:

#define IN_CPP 1
#include "header.h"

在其余编译单元中:

#include "header.h"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM