10.5“warning:macro replacement within a string literal”什
有些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。
#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。