将格式说明符传递给宏中的printf
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将格式说明符传递给宏中的printf相关的知识,希望对你有一定的参考价值。
#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
然后以给定的格式打印它的表达式和值?
答案
%d
是一个格式字符串,所以它需要是双引号,就像任何其他字符串文字一样。另外,为标识符使用有意义的名称。
#define PRINT(expr, fmt) printf("Value of expression %s is " fmt "
", #expr, expr)
PRINT(1+3+1, "%d");
您可以使用预处理器的字符串化运算符将%d
转换为"%d"
,但它很脆弱(它对空白非常敏感),容易出现风险(不运行预处理器的代码分析工具可能认为代码使用的是变量d
或阻塞%
上没有左侧的语法错误),最重要的是,它对人类读者有误导性。
根据经验,如果你有充分的理由,你应该只使用不卫生的宏(离开语言语法的宏)。为调试目的排版表达式(#expr
)是一个很好的理由。只有当你进入模糊编程比赛时,编写两个字符较短的程序是一个很好的理由。
另一答案
你可以尝试这样的事情;
#define PRINT(A,B) printf("Value of expression %s is "#B"
",#A,(A))
以上是关于将格式说明符传递给宏中的printf的主要内容,如果未能解决你的问题,请参考以下文章