Sun Studio 12:C 用户指南

6.5.4 宏替换

在 ISO C 之前,从未详细描述宏替换过程。这种不明确性产生很多有分歧的实现。依赖于比明显常量替换和简单类函数宏更奇特的事情的任何代码可能并不真正可移植。本手册无法指出旧 C 宏替换实现与 ISO C 版本之间的所有差异。除标记粘贴和字符串化之外的几乎所有宏替换的使用产生的标记系列均与以前完全相同。此外,ISO C 宏替换算法可以完成在旧 C 版本中无法完成的工作。例如,


#define name (*name)

使 name 的任何使用均替换为通过 name 进行的间接引用。旧 C 预处理程序会产生大量圆括号和星号,并最终产生关于宏递归的错误。

ISO C 对宏替换方法的主要更改是:要求在替换标记列表中进行替换之前针对宏参数(而不是那些本身是宏替换操作符 ### 的操作数)进行递归扩展。然而,这种更改很少在结果标记中产生实际差异。