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

时间:2014-08-31 01:05:51

标签: c macros c-preprocessor

我对K& R 2nd Ed中关于宏的解释感到有点困惑,第90页。这是段落:

  

在引用的字符串中不替换正式参数。但是,如果参数名称在替换文本中以#开头,则组合将扩展为带引号的字符串,参数将替换为实际参数。

我不确定第二句话在说什么。它继续用“调试打印宏”来解释它的用法。

  

这可以与字符串连接结合使用,例如,调试打印宏:

#define dprint(expr) printf(#expr " = %g\n", expr);

编辑:

所有输入都很有用。谢谢你们。

4 个答案:

答案 0 :(得分:5)

如果你这样定义宏:

#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);

字符串文字串联将第一个参数视为单个字符串文字。

答案 1 :(得分:3)

这只是一个简洁的功能,您可以将宏参数转换为字符串文字,主要用于调试目的。所以

dprint(x + y);

由C预处理器扩展到此

printf("x + y = %g\n", x + y);

注意参数expr的值是如何出现在字符串文字中以及宏生成的代码中的。为此,您需要在expr前加#前缀以创建字符串文字。

有一点值得指出的是,相邻的字符串文字被组合成单个字符串文字,例如"x + y" " = %g\n"合并为"x + y = %g\n"

答案 2 :(得分:2)

#expr已扩展为"expr"。彼此相邻的两个字符串文字会自动连接。我们可以看到为gcc -E调用dprint(test)将提供以下输出:

("test" " = %g\n");

答案 3 :(得分:0)

This网站可能有所帮助。它描述了如何实现字符串化。