将格式说明符传递给宏

时间:2018-01-22 19:15:26

标签: 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;
}

如何编写一个获取两个参数expressionformat specifier的宏,然后以给定的格式打印它的表达式和值?

2 个答案:

答案 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))