C++ 带“的宏”;占位符;价值
我正在使用一个包含一组预处理器库的库。其中一个是FOR_EACH样式的宏,它在C++ 带“的宏”;占位符;价值,c++,c++11,c-preprocessor,variadic-macros,C++,C++11,C Preprocessor,Variadic Macros,我正在使用一个包含一组预处理器库的库。其中一个是FOR_EACH样式的宏,它在\uu VA_ARGS\uu上迭代,并为每个参数调用用户提供的宏。用户提供的宏称为:SOME\u宏(当前参数) 但是,问题是它只适用于用户提供的带有单个参数的宏。我正在尝试做一些特殊的事情,包括struct的名称和struct中的每个字段。问题是,这需要宏的两个参数 由于我正在使用的库只接受一元宏,有没有办法将附加参数“绑定”到我的宏 现在,我必须在宏中硬编码结构的名称。因此,如果我正在使用的struct名为Foo,我
\uu VA_ARGS\uu
上迭代,并为每个参数调用用户提供的宏。用户提供的宏称为:SOME\u宏(当前参数)
但是,问题是它只适用于用户提供的带有单个参数的宏。我正在尝试做一些特殊的事情,包括struct
的名称和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();
}
也许你可以让
字段成为(A,B)
,这样A
就是STRUCT
的值,B
就是字段的值(在你的扩展中)?我想知道这是否可行。添加了预处理器标签,允许搜索@iammilind.hack:)解释的技术