#include<stdio.h>
#define PRINT(A,B) printf("Value of expression %s is %*",#A,#B,(A))
int main(void){
PRINT(1+3+1,%d);
return 0;
}
如何编写一个获取两个参数:expression
和format specifier
的宏,然后以给定的格式打印它的表达式和值?
答案 0 :(得分:6)
%d
是格式字符串,因此它需要使用双引号,就像任何其他字符串文字一样。另外,为标识符使用有意义的名称。
#define PRINT(expr, fmt) printf("Value of expression %s is " fmt "\n", #expr, expr)
PRINT(1+3+1, "%d");
您可以使用预处理程序的字符串化运算符将%d
转换为"%d"
,但它很脆弱(它对空白非常敏感),容易出现风险(代码分析工具不能运行预处理器可能会认为代码正在使用变量d
或阻塞%
上的语法错误而没有左侧),最重要的是,它会误导人类读者。
根据经验,如果你有充分的理由,你应该只使用不卫生的宏(离开语言语法的宏)。为调试目的排版表达式(#expr
)是一个很好的理由。编写两个字符较短的程序是一个很好的理由,只有当你进入一个混淆的编程比赛时。
答案 1 :(得分:0)
你可以试试这样的事情;
#define PRINT(A,B) printf("Value of expression %s is "#B"\n",#A,(A))