【问题标题】:Macro with "placeholder" value具有“占位符”值的宏
【发布时间】:2011-08-30 07:02:13
【问题描述】:

我正在使用一个包含一组预处理器库的库。其中之一是 FOR_EACH 样式的宏,它遍历 __VA_ARGS__ 并为每个参数调用用户提供的宏。用户提供的宏被称为:SOME_MACRO(current_arg)

但是,问题在于它仅适用于用户提供的带有 single 参数的宏。我正在尝试做一些特别的事情,其中​​涉及struct 的名称和结构中的每个字段。问题是,这需要宏的两个参数。

由于我正在使用的库只接受一元宏,有没有办法将附加参数“绑定”到我的宏?

到目前为止,我必须在宏中硬编码结构的名称。所以,如果我正在使用的struct 被命名为Foo,我不得不说:

#define MY_MACRO(FIELD) /* do something with &Foo::FIELD */

有没有办法我可以将第二个STRUCT 参数“绑定”到宏,也许还有一些进一步的间接性,这样当库调用我的宏时,它就可以扩展为:

#define MY_MACRO(FIELD) /* do something with &STRUCT::FIELD */

【问题讨论】:

  • 也许你可以让FIELD 成为(A, B),所以ASTRUCT 的值,BFIELD 的值(在你的扩展中)?
  • 我很想知道这是否可行。
  • 添加了预处理器标签,允许搜索@iammilind 解释的技术。

标签: c++ c++11 c-preprocessor variadic-macros


【解决方案1】:

是的。您可以使用以下技术。

#define MY_MACRO(FIELD) EXPAND FIELD
#define EXPAND(X, FIELD) X::FIELD()

在下面的测试代码中使用:

struct foo { static int f() { return 0; } };
struct STRUCT { static int f() { return 1; } };

#define MY_MACRO(FIELD) EXPAND FIELD
#define EXPAND(X, FIELD) X::FIELD()

int main ()
{
  int i = MY_MACRO((STRUCT,f)); // see here braces inside braces
}

以上代码扩展为,

int main ()
{
  int i = STRUCT::f();
}

【讨论】:

  • 真棒黑客:)
猜你喜欢
  • 2015-06-29
  • 2016-09-22
  • 2021-10-07
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多