#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;
}
Run Code Online (Sandbox Code Playgroud)
如何编写一个宏它得到两个参数:expression和format specifier然后打印在给定的格式它的表达和价值?
%d是一个格式字符串,所以它需要是双引号,就像任何其他字符串文字一样.另外,为标识符使用有意义的名称.
#define PRINT(expr, fmt) printf("Value of expression %s is " fmt "\n", #expr, expr)
PRINT(1+3+1, "%d");
Run Code Online (Sandbox Code Playgroud)
你可以逃脱预处理器的字符串化操作把像%d成"%d",但它是脆弱的(这是对空格很敏感),不运行的预处理器容易发生危险(代码分析工具可能会认为该代码使用变量d或在%没有左侧的情况下阻止语法错误),最重要的是,它会误导人类读者.
根据经验,如果你有充分的理由,你应该只使用不卫生的宏(离开语言语法的宏).为调试目的排版表达式(#expr)是一个很好的理由.只有当你进入模糊编程比赛时,编写两个字符较短的程序是一个很好的理由.