如何在标头中连接字符串

How to concatenate strings in a header?

本文关键字:连接 字符串      更新时间:2023-10-16

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

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

我的问题是:

如何在没有空格的情况下将前缀与另一个字符串连接?

示例:

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

BOTH的期望结果:pre_keyword

显然中的+

BOTH PREFIX+KEYWORD

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

#define BOTH PREFIX KEYWORD

相邻的文字会自动连接,因此

"pre_" "keyword" 

将成为

"pre_keyword"

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

#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")

其将扩展到CCD_ 1。

现在,如果"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