0

可能重复:
C 预处理器和连接
C 预处理器 # 和 ## 运算符

在搜索我使用(在嵌入式项目上)开发的操作系统的一些 C 代码时,我发现了以下定义语句:

#define concatn(s1, s2) s1 ## s2

我从未见过“##”运算符,经过一番认真的谷歌搜索后,我找不到任何对它的引用。这里发生了什么?

我搜索了操作系统源代码,但找不到任何对字符串“##”的引用,该字符串被定义为其他形式的 C 运算符。这是标准 C,还是可能/可能是编译器的一个特性?

4

4 回答 4

4

它是预处理器的一部分,标记的串联,concatn(x,y)并被替换为xy.

于 2012-10-09T19:51:38.483 回答
4

##是 C 中的标记粘贴运算符。它用于连接两个标记。

例子:

#define PASTE(front, back) front ## back

然后

PASTE(name, 1)    

创建令牌name1

于 2012-10-09T19:55:32.043 回答
3

这是标准的 c 预处理器字符串连接运算符

于 2012-10-09T19:51:47.137 回答
2

它用于连接两个标记(在本例中为 s1 和 s2)。更多细节在这里。它是标准的 C 预处理,因此每个符合标准的编译器都应该处理它。

例如:

concatn(a_, b) = 1;

将宏变为:

a_b = 1;
于 2012-10-09T19:51:47.347 回答