[英]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.