Oracle Solaris Studio 12.2:C 用户指南

6.5.6 标记粘贴

在 K&R C 中,将两个标记组合在一起至少有两种方法。以下代码中的两个调用均使用 x1 两个标记生成单个标识符 x1


#define self(a) a
#define glue(a,b) a/**/b ?
self(x)1
glue(x,1)

同样,ISO C 不认可这两种方法。在 ISO C 中,以上两个调用均生成两个独立标记 x1。可以通过使用 ## 宏替换操作符针对 ISO C 重新编写以上第二种方法:


#define glue(a,b) a ## b
glue(x, 1)

只有在定义了 __STDC__ 时,才应将 # 和 ## 用作宏替换操作符。由于 ## 是实际操作符,因此对于定义和调用中的空白,调用更加自由。

编译器针对未定义的 ## 运算(C 标准,第 3.4.3 节)(其中一个 ## 结果未经定义,当进行预处理时,包含多个标记而不是一个标记(C 标准,第 6.10.3.3(3) 节))发出警告诊断。未定义的 ## 运算的结果现在定义为通过预处理连接 ## 操作数所创建的字符串而生成的第一个独立标记。

没有什么直接方式可用来实现两种旧式粘贴方案中第一种方案,但是由于它在调用时引入了粘贴的任务,因此使用它的频率比使用其他形式要低。