【问题标题】:Stringizing macro arguments in a multi-level macro call在多级宏调用中对宏参数进行字符串化
【发布时间】:2011-12-09 12:26:34
【问题描述】:

我有一个这样的宏:

#define SHOW_EXPR(x) printf ("%s=%d\n", #x, (x))

有效:

#define FOO 123
int BAR = 456;
SHOW_EXPR(FOO+BAR);

这会按预期打印FOO+BAR=579

现在我正在尝试定义一个调用 SHOW_EXPR 的宏:

#define MY_SHOW_EXPR(x) (printf ("Look ma, "), SHOW_EXPR(x))
MY_SHOW_EXPR(FOO+BAR)

这会打印出Look ma, 123+BAR=579,这也是意料之中的,但这不是我想要的。

是否可以定义 MY_SHOW_EXPR 以使其做正确的事情?

(实际的宏比这里显示的要复杂一些。我知道宏是邪恶的。)

【问题讨论】:

  • @Steve Jessop:Look ma, FOO+BAR=579 这样的东西会很好 ;)

标签: c macros c-preprocessor variadic-macros stringification


【解决方案1】:

宏就像菜刀,你可以用它们做坏事,但它们本身并不是坏事。

我会做这样的事情

#define SHOW_EXPR_(STR, EXP) printf (STR "=%d\n", EXP)
#define SHOW_EXPR(...) SHOW_EXPR_(#__VA_ARGS__, (__VA_ARGS__))
#define MY_SHOW_EXPR(...) SHOW_EXPR_("Look ma, " #__VA_ARGS__, (__VA_ARGS__))

如果表达式包含逗号,它甚至可以作为一个额外的功能使用。

【讨论】:

  • 谢谢。更改原始宏是不可取的,但如果没有其他帮助...
  • @Jens:也许是__VA_ARGS__ 而不是__VA_ARG__
  • @JosephQuinsey,很可能。这是通常具有自动完成功能的结果,因此我不必记住这些随机名称的确切拼写。我会编辑它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-17
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 2014-09-01
相关资源
最近更新 更多