我想在专用的头文件中定义一堆常量。
由于某些前缀经常出现,我想定义一次,然后在需要时添加它们。
我的问题是:
如何将前缀与另一个没有空格的字符串连接起来?
例子:
#define PREFIX "pre_"
#define KEYWORD "keyword"
#define BOTH PREFIX+KEYWORD
两者的期望结果:pre_keyword
显然 + in
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")
这将扩展为"pre_" "keyword"
.
现在 if"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
。