如何修正带双引号的DISP宏?当前宏展开存在多余双引号问题
修复宏DISP的字符串展开问题
我来帮你搞定这个宏定义的问题!你当前遇到的多余双引号问题,根源是对宏的字符串化操作#的用法理解有点偏差——#f会直接把参数f转换成带双引号的字符串(比如传入sqrt时,#f就变成"sqrt"),而你原来的宏没有把这个字符串和后续的格式部分正确拼接,导致展开后出现语法错误的多余引号。
修正后的代码
直接调整宏的字符串拼接方式就可以解决问题,C语言支持相邻字符串字面量自动合并的特性,我们可以利用这一点:
#include <math.h> #include <stdio.h> #define DISP(f,x) printf(#f "(%g) = %g\n", x, f(x)) int main(void) { DISP(sqrt, 3.0); return 0; }
为什么这样能行?
当你调用DISP(sqrt, 3.0)时,宏会展开成:
printf("sqrt" "(%g) = %g\n", 3.0, sqrt(3.0));
C编译器会自动把相邻的两个字符串"sqrt"和"(%g) = %g\n"合并成单个字符串"sqrt(%g) = %g\n",这正是你想要的格式字符串,完全符合需求。
你之前尝试的误区解释
- 给
#f加转义引号或者额外双引号:这会让字符串化后的"sqrt"再套一层引号,变成"\"sqrt\"",反而更混乱; - 使用
##f:##是宏的连接操作符,用来拼接标识符(比如把两个变量名拼成一个),不是用来处理字符串的,所以在这里完全不适用。
用gcc -E预编译验证的话,就能看到展开后的正确代码,编译运行后也会正常输出sqrt(3) = 1.73205这类结果。
内容的提问来源于stack exchange,提问作者gdonald
相关产品推荐
相关产品推荐

