#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;
}
如何编写一个获取两个参数的宏:表达式
和格式说明符
,然后以给定格式打印表达式及其值?
最佳答案
%d
是一种格式字符串,因此它需要用双引号引起来,就像任何其他字符串文字一样。另外,为标识符使用有意义的名称。
#define PRINT(expr, fmt) printf("Value of expression %s is " fmt "\n", #expr, expr)
PRINT(1+3+1, "%d");
您可以摆脱预处理器的字符串化运算符,将 %d
之类的内容转换为 "%d"
,但它很脆弱(对空格非常敏感),有风险-容易(不运行预处理器的代码分析工具可能会认为代码正在使用变量 d
或因 %
上没有左手的语法错误而阻塞侧),最重要的是,它会误导人类读者。
根据经验,如果有充分的理由,则应该只使用不卫生的宏(偏离语言语法的宏)。出于调试目的排版表达式 (#expr
) 是一个很好的理由。仅当您参加模糊编程竞赛时,编写短两个字符的程序才是一个很好的理由。
关于c - 在宏中将格式说明符传递给 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48388748/