簡體   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