通过宏将函数参数传递给函数
Passing function parameters to a function through a macro
我想创建一个宏,其中一个参数是宏中使用的函数的参数。
#define Macro(PERAMS, OTHER) \
functionBeingUsed(PERAMS); \
OTHER;
Macro(1,2,3,4, int i = 0);
如您所见,宏和函数都使用了逗号。这会导致代码损坏。
我想知道是否有一种方法可以实现我需要的结果,因此代码可以像下面这样解释。
Macro((1,2,3,4), int i = 0);
请注意我没有使用 C++11。
无法执行您所描述的操作。但是,您可以使用 variadic macros 执行类似的操作。您需要将 PARAMS 部分放在末尾,它看起来如下所示:
#define Macro(OTHER, ...) \
functionBeingUsed(__VA_ARGS__); \
OTHER;
Macro(int i = 0, 1, 2, 3, 4);
我认为唯一的答案是使用多个宏
#define MacroBegin \
\PreFunction
#define MacroEnd \
\PostFunction
MacroBegin
functionBeingCalled(1,2,3,4);
MacroEnd
每当你需要用预处理器做任何重要的事情时,你应该立即跳转到Boost.PP库。在这里,BOOST_PP_REMOVE_PARENS 宏似乎是相关的:
#define Macro(PARAMS, OTHER) \
functionBeingUsed(BOOST_PP_REMOVE_PARENS(PARAMS)); \
OTHER;
Macro((1,2,3,4), int i = 0);
或者,您可以只写 functionBeingUsed PARAMS
并使用传递的括号。
为了区分哪些逗号属于宏本身,哪些属于被调用的函数,您必须将函数参数包裹在括号中,例如:
Macro((1,2,3,4), int i = 0);
然后您必须从宏内的函数调用中删除括号,因为它们将来自宏参数,例如:
#define Macro(PERAMS, OTHER) \
functionBeingUsed PERAMS; \
OTHER;
所以,像这样:
Macro((1,2,3,4), int i = 0);
将解决这个问题:
functionBeingUsed (1,2,3,4);
int i = 0;
即使被调用的函数不接受任何输入参数,也要记住额外的括号:
Macro((), ...);
functionBeingUsed ();
...;
为了保持你的语法,你可以这样做:
#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
#define COUNT(...) COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
// Warning: COUNT() return 1 (as COUNT(A)) :-/
#define IDENTITY(N) N
#define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))
#define F_1(a) functionBeingUsed(); a;
#define F_2(a, b) functionBeingUsed(a); b;
#define F_3(a, b, c) functionBeingUsed(a, b); c;
#define F_4(a, b, c, d) functionBeingUsed(a, b, c); d;
#define F_5(a, b, c, d, e) functionBeingUsed(a, b, c, d); e;
#define F_6(a, b, c, d, e, f) functionBeingUsed(a, b, c, d, e); f;
#define F_7(a, b, c, d, e, f, g) functionBeingUsed(a, b, c, d, e, f); g;
#define F_8(a, b, c, d, e, f, g, h) functionBeingUsed(a, b, c, d, e, f, g); h;
#define DISPATCH(N) F_ ## N
#define Macro(...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(__VA_ARGS__)
但将语法更改为更简单:
#define Macro(PARAMS, OTHER) \
functionBeingUsed PARAMS; \
OTHER;
Macro((1,2,3,4), int i = 0);
我想创建一个宏,其中一个参数是宏中使用的函数的参数。
#define Macro(PERAMS, OTHER) \
functionBeingUsed(PERAMS); \
OTHER;
Macro(1,2,3,4, int i = 0);
如您所见,宏和函数都使用了逗号。这会导致代码损坏。
我想知道是否有一种方法可以实现我需要的结果,因此代码可以像下面这样解释。
Macro((1,2,3,4), int i = 0);
请注意我没有使用 C++11。
无法执行您所描述的操作。但是,您可以使用 variadic macros 执行类似的操作。您需要将 PARAMS 部分放在末尾,它看起来如下所示:
#define Macro(OTHER, ...) \
functionBeingUsed(__VA_ARGS__); \
OTHER;
Macro(int i = 0, 1, 2, 3, 4);
我认为唯一的答案是使用多个宏
#define MacroBegin \
\PreFunction
#define MacroEnd \
\PostFunction
MacroBegin
functionBeingCalled(1,2,3,4);
MacroEnd
每当你需要用预处理器做任何重要的事情时,你应该立即跳转到Boost.PP库。在这里,BOOST_PP_REMOVE_PARENS 宏似乎是相关的:
#define Macro(PARAMS, OTHER) \
functionBeingUsed(BOOST_PP_REMOVE_PARENS(PARAMS)); \
OTHER;
Macro((1,2,3,4), int i = 0);
或者,您可以只写 functionBeingUsed PARAMS
并使用传递的括号。
为了区分哪些逗号属于宏本身,哪些属于被调用的函数,您必须将函数参数包裹在括号中,例如:
Macro((1,2,3,4), int i = 0);
然后您必须从宏内的函数调用中删除括号,因为它们将来自宏参数,例如:
#define Macro(PERAMS, OTHER) \
functionBeingUsed PERAMS; \
OTHER;
所以,像这样:
Macro((1,2,3,4), int i = 0);
将解决这个问题:
functionBeingUsed (1,2,3,4);
int i = 0;
即使被调用的函数不接受任何输入参数,也要记住额外的括号:
Macro((), ...);
functionBeingUsed ();
...;
为了保持你的语法,你可以这样做:
#define COUNT_N(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
#define COUNT(...) COUNT_N(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
// Warning: COUNT() return 1 (as COUNT(A)) :-/
#define IDENTITY(N) N
#define APPLY(macro, ...) IDENTITY(macro(__VA_ARGS__))
#define F_1(a) functionBeingUsed(); a;
#define F_2(a, b) functionBeingUsed(a); b;
#define F_3(a, b, c) functionBeingUsed(a, b); c;
#define F_4(a, b, c, d) functionBeingUsed(a, b, c); d;
#define F_5(a, b, c, d, e) functionBeingUsed(a, b, c, d); e;
#define F_6(a, b, c, d, e, f) functionBeingUsed(a, b, c, d, e); f;
#define F_7(a, b, c, d, e, f, g) functionBeingUsed(a, b, c, d, e, f); g;
#define F_8(a, b, c, d, e, f, g, h) functionBeingUsed(a, b, c, d, e, f, g); h;
#define DISPATCH(N) F_ ## N
#define Macro(...) IDENTITY(APPLY(DISPATCH, COUNT(__VA_ARGS__)))(__VA_ARGS__)
但将语法更改为更简单:
#define Macro(PARAMS, OTHER) \
functionBeingUsed PARAMS; \
OTHER;
Macro((1,2,3,4), int i = 0);