具有“占位符”值的宏

时间:2011-05-21 16:30:50

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

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

然而,问题是它只能用于提供单个参数的用户提供的宏。我正在尝试做一些特殊的事情,它涉及struct的名称和结构中的每个字段。问题是,这需要宏的两个参数。

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

截至目前,我必须在宏中硬编码结构的名称。因此,如果我正在使用的struct名为Foo,我必须说:

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

是否有某种程度上我可以将第二个STRUCT参数“绑定”到宏中,或许可以进一步间接,这样当库调用我的宏时它就能够扩展为:

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

1 个答案:

答案 0 :(得分:5)

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

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