有些ANSI 前的编译器/预处理器把下面这样的宏
#define TRACE(var, fmt) printf("TRACE: var = fmt\n", var)
解释为
TRACE(i, %d);
这样的调用会被扩展为
printf("TRACE: i = %d\n", i);
换言之,
字符串常量内部也作了宏参数扩展。
K&R 和标准C 都没有定义这样的宏扩展。
当你希望把宏参数转成字符串时,
你可以使用新的预处理操作符#和字符串常量连接(ANSI的另一个新功能):
#define TRACE(var, fmt) \
printf("TRACE: " #var " = " #fmt "\n", var)
参见问题11.18。