繁体   English   中英

在printf中使用带有数字符号的宏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM