如何连接标题中的字符串?

时间:2013-02-12 08:16:28

标签: c++ header

我想在专用的头文件中定义一堆常量。

由于某些前缀经常发生,我想定义它们一次,然后在需要时添加它们。

我的问题是:

如何将前缀与另一个没有空格的字符串连接起来?

示例:

#define PREFIX "pre_"
#define KEYWORD "keyword"
#define BOTH PREFIX+KEYWORD

BOTH的所需结果:pre_keyword

显然是

中的+
BOTH PREFIX+KEYWORD

不起作用。 那么这些令牌如何连接起来呢?

2 个答案:

答案 0 :(得分:6)

只需

#define BOTH PREFIX KEYWORD

会这样做。

相邻的文字会自动连接,所以

"pre_" "keyword" 

会变成

"pre_keyword"

答案 1 :(得分:1)

如果你想坚持使用宏,这只是对正在发生的事情以及如何改进它的简短解释。

#define PREFIX "pre_"
#define KEYWORD "keyword"

定义了两个宏,它们将在预处理过程中被它们的定义所取代。

#define BOTH PREFIX+KEYWORD
然后

将替换为

"pre_"+"keyword"

导致指针添加,显然不是你想要的。与在C和C ++中一样,我们可以通过在没有任何运算符的情况下将部件彼此相邻地分开来分割C字符串(它们将被视为一个 C字符串文字,而不是的串联两个 C字符串):

"pre_" "keyword"

所以你想要宏

#define BOTH PREFIX KEYWORD

如果您的程序中经常使用这些前缀,我建议使用以下方法:

#define PRE(x) "pre_" x

并使用

“调用”宏
PRE("keyword")

将扩展为"pre_" "keyword"

现在,如果"keyword"始终是编译时C字符串,可以写成令牌(没有特殊字符),您甚至可以在没有引号的情况下使其工作:

#define PRE(x) "pre_" #x

#x会将令牌x“转换”为C字符串文字。然后,您可以编写以下内容:

PRE(keyword)

请注意,这是由预处理器完成的,因此keyword甚至可以是C / C ++关键字,它仍然有效,例如PRE(if)

为了完整性:如果您希望结果仍然是令牌,则可以使用预处理器运算符##执行标记串联:

#define PRE(x) pre_ ## x

然后,PRE(keyword)将展开为pre_keyword