可能重复:
C 预处理器和连接
C 预处理器 # 和 ## 运算符
在搜索我使用(在嵌入式项目上)开发的操作系统的一些 C 代码时,我发现了以下定义语句:
#define concatn(s1, s2) s1 ## s2
我从未见过“##”运算符,经过一番认真的谷歌搜索后,我找不到任何对它的引用。这里发生了什么?
我搜索了操作系统源代码,但找不到任何对字符串“##”的引用,该字符串被定义为其他形式的 C 运算符。这是标准 C,还是可能/可能是编译器的一个特性?
可能重复:
C 预处理器和连接
C 预处理器 # 和 ## 运算符
在搜索我使用(在嵌入式项目上)开发的操作系统的一些 C 代码时,我发现了以下定义语句:
#define concatn(s1, s2) s1 ## s2
我从未见过“##”运算符,经过一番认真的谷歌搜索后,我找不到任何对它的引用。这里发生了什么?
我搜索了操作系统源代码,但找不到任何对字符串“##”的引用,该字符串被定义为其他形式的 C 运算符。这是标准 C,还是可能/可能是编译器的一个特性?
它是预处理器的一部分,标记的串联,concatn(x,y)
并被替换为xy
.
##
是 C 中的标记粘贴运算符。它用于连接两个标记。
例子:
#define PASTE(front, back) front ## back
然后
PASTE(name, 1)
创建令牌name1
这是标准的 c 预处理器字符串连接运算符
它用于连接两个标记(在本例中为 s1 和 s2)。更多细节在这里。它是标准的 C 预处理,因此每个符合标准的编译器都应该处理它。
例如:
concatn(a_, b) = 1;
将宏变为:
a_b = 1;