具有"placeholder"值的宏

Macro with "placeholder" value

本文关键字:placeholder 具有      更新时间:2023-10-16

我正在使用一个包含一组预处理器库的库。 其中之一是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 */

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

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