在 K&R C 中,以下代码生成文本字符串 "x y!":
#define str(a) "a!" ? str(x y)
因此,预处理程序在文本字符串和字符常量中查找看起来类似宏参数的字符。ISO C 认识到此功能的重要性,但不允许对部分标记的操作。在 ISO C 中,对上述宏的所有调用都将生成文本字符串 "a!"。为在 ISO C 中实现旧效果,请使用 # 宏替换运算符和文本字符串串联。
#define str(a) #a "!" str(x y)
该代码会生成两个文本字符串 "x y" 和 "!",而这两个字符串在串联后会生成相同的 "x y!"。
不直接替换字符常量的类似操作。此功能的主要用法与下例类似:
#define CNTL(ch) (037 & ’ch’) ? CNTL(L)
此示例生成以下结果,该结果对 ASCII L 控制字符求值。
(037 & ’L’)
最佳解决办法是将此宏的所有用法更改为如下形式:
#define CNTL(ch) (037 & (ch)) CNTL(’L’)
此代码的可读性和实用性更强,因为它还可以应用于表达式。