我对K& R 2nd Ed中关于宏的解释感到有点困惑,第90页。这是段落:
在引用的字符串中不替换正式参数。但是,如果参数名称在替换文本中以#开头,则组合将扩展为带引号的字符串,参数将替换为实际参数。
我不确定第二句话在说什么。它继续用“调试打印宏”来解释它的用法。
这可以与字符串连接结合使用,例如,调试打印宏:
#define dprint(expr) printf(#expr " = %g\n", expr);
编辑:
所有输入都很有用。谢谢你们。
答案 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网站可能有所帮助。它描述了如何实现字符串化。