prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 11.18

Q“warning: macro replacement within a string literal” 这个警告信息是什么意思?


A一些 ANSI 之前的编译器/预处理器会这样解释宏定义:

	#define TRACE(var, fmt) printf("TRACE: var = fmt\n", var)
调用像
	TRACE(i, %d);
这样的宏会展开为:
	printf("TRACE: i = %d\n", i);
换句话说,宏参数即使在字符串字面量和字符常量中也会被展开。(这种解释可能仅仅是早期实现的一个偶然,但对于像这样的宏来说可能很有用。)

宏展开**不是**按照 K&R 或标准 C 的方式定义的。(这样做可能危险且令人困惑:请参阅问题 10.22。)当您确实想将宏参数转换为字符串时,可以使用新的#预处理器运算符,以及字符串字面量连接(另一项新的 ANSI 特性)

	#define TRACE(var, fmt) \
		printf("TRACE: " #var " = " #fmt "\n", var)
另请参阅问题 11.17

参考文献:H&S 第 3.3.8 节,第 51 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管