c - 在宏中将格式说明符传递给 printf

标签 c macros format-specifiers

#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/

相关文章:

unix - SAS 在 Unix 服务器上定义宏

c - 在没有相应值的情况下在 printf() 中使用格式说明符

c++ - C/C++ 中的自展开宏循环

c - 意外的无符号最大结果

c - C 中的格式说明符 : can %s can store integer values?

c - GCC v4.9.2 上无法识别的命令行选项 ‘-rdynamic’

c - 0xff的补码怎么不是0x00呢?

c - 如何从递归函数内部写入文件

c - 在 C 中使用通配符查找文件名

c - C预处理器中的嵌套##运算符