将格式说明符传递给宏中的printf

问题描述 投票:-1回答:2
#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然后以给定的格式打印它的表达式和值?

c macros format-specifiers
2个回答
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)是一个很好的理由。只有当你进入模糊编程比赛时,编写两个字符较短的程序是一个很好的理由。


0
投票

你可以尝试这样的事情;

#define PRINT(A,B) printf("Value of expression %s is "#B"\n",#A,(A))
© www.soinside.com 2019 - 2024. All rights reserved.