带双引号的宏

gdo*_*ald 0 c macros

我需要创建一个宏

DISP(sqrt, 3.0)
Run Code Online (Sandbox Code Playgroud)

扩展为

printf("sqrt(%g) = %g\n", 3.0, sqrt(3.0));
Run Code Online (Sandbox Code Playgroud)

这是我目前尚未完成的尝试:

#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;
}
Run Code Online (Sandbox Code Playgroud)

gcc -E 表明我当前在其中有一个额外的双引号。

如果在#f之前加上任何双引号或转义的双引号,或者如果我使用## f,则宏将不再扩展。怎么修?

小智 5

你要这个:

#define DISP(f,x) printf(#f"(%g) = %g\n", x, f(x))
Run Code Online (Sandbox Code Playgroud)

提供以下输出:

sqrt(3) = 1.73205

(请参阅http://codepad.org/hX96Leta

  • 好的宏规范是在可能的情况下括号括参数。您可以将f(x)更改为f(x)。对于函数指示符来说,这可能是不熟悉的语法,但是它是正确的C语言,可以保护宏用户在为f参数传递更通用的表达式(而不仅仅是简单的函数名)时提供保护。 (2认同)