1

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

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

我的问题是:

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

例子:

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

两者的期望结果:pre_keyword

显然 + in

BOTH PREFIX+KEYWORD

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

4

2 回答 2

6

只是

#define BOTH PREFIX KEYWORD

会做的。

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

"pre_" "keyword" 

会成为

"pre_keyword"
于 2013-02-12T08:16:54.487 回答
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".

现在 if"keyword"永远是一个编译时的 C 字符串,可以写成一个标记(没有特殊字符),你甚至可以让它在没有引号的情况下工作:

#define PRE(x) "pre_" #x

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

PRE(keyword)

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

为了完整性:如果您希望结果仍然是一个令牌,您可以使用预处理器运算符执行令牌连接##

#define PRE(x) pre_ ## x

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

于 2013-02-12T08:37:25.027 回答