带双引号的宏

时间:2018-03-29 21:24:04

标签: c macros

我需要创建一个宏

DISP(sqrt, 3.0)

扩展为

printf("sqrt(%g) = %g\n", 3.0, sqrt(3.0));

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

#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;
}

gcc -E表明我目前有一个额外的双引号。

如果我在#f之前放置任何双引号或双引号,或者如果我使用## f,则宏不再展开。怎么解决?

2 个答案:

答案 0 :(得分:4)

你想要这个:

sqrt(3) = 1.73205

提供以下输出:

{{1}}

(见http://codepad.org/hX96Leta

答案 1 :(得分:3)

您可以使用:

#define DISP(f,x) printf(#f "(%g) = %g\n", x, f(x))

这扩展到

printf("sqrt" "(%g) = %g\n", 3.0, sqrt(3.0));

在C中,您可以将两个或多个字符串文字合并为一个,如下所示:

const char *txt = "one" " and" " two";
puts(txt);

将输出one and two

修改

另请注意,建议放置宏和宏参数 括号内:

#define DISP(f,x) (printf(#f "(%g) = %g\n", (x), (f)(x)))