Oracle® Solaris Studio 12.4:C 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

6.4.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) 节))发出警告诊断。未定义的 ## 运算的结果现在定义为通过预处理连接 ## 操作数所创建的字符串而生成的第一个独立标记。

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