[英]Using macros in printf with a number sign
我对K&R 2nd Ed中关于宏的解释感到有点困惑,第90页。 这是段落:
正则参数不会在带引号的字符串中替换。 但是,如果参数名称在替换文本中以#开头,则组合将扩展为带引号的字符串,参数将替换为实际参数。
我不确定第二句话在说什么。 它继续用“调试打印宏”来解释它的用法。
这可以与字符串连接组合,例如,调试打印宏:
#define dprint(expr) printf(#expr " = %g\n", expr);
编辑:
所有输入都很有用。 感谢你们。
如果您像这样定义宏:
#define MAKE_STRING(X) #X
然后,你可以做这样的事情:
puts(MAKE_STRING(a == b));
这将扩展为:
puts("a == b");
在dprint()
示例中,它打印出表达式的字符串形式以及表达式值。
dprint(sin(x)/2);
将扩展为:
printf("sin(x)/2" " = %g\n", sin(x)/2);
字符串文字串联将第一个参数视为单个字符串文字。
它只是一个简洁的功能,您可以将宏参数转换为字符串文字,主要用于调试目的。 所以
dprint(x + y);
由C预处理器扩展到此
printf("x + y = %g\n", x + y);
请注意参数expr
的值如何在字符串文字内以及宏生成的代码中出现。 为此,您需要在expr
加上#
以创建字符串文字。
值得指出的一点是,相邻的字符串文字被组合成单个字符串文字,例如"x + y" " = %g\\n"
被组合成"x + y = %g\\n"
。
#expr
扩展为"expr"
。 彼此相邻的两个字符串文字会自动连接。 我们可以看到为dprint(test)
调用gcc -E
将给出以下输出:
("test" " = %g\n");
这个网站可能有帮助。 它描述了如何实现字符串化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.