将格式说明符传递给宏中的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;
}

如何编写一个获取两个参数的宏:expressionformat 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的主要内容,如果未能解决你的问题,请参考以下文章

将模板类型传递给宏[重复]

Excel VBA 宏中的数组

如何将 printf() 包装到函数或宏中?

imageJ 宏中的字符串格式

是否可以使用传递给宏的项目参数作为方法?

是否可以迭代可变参数宏中的参数?