我想创建一个宏,其中的参数之一是该宏内使用的函数的参数。
#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。
答案 0 :(得分:2)
每当您需要对预处理器进行不重要的操作时,都应立即跳转到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
并使用传递的括号。
答案 1 :(得分:1)
无法执行您描述的操作。但是,您可以使用variadic macros做类似的事情。您需要将PARAMS部分放在末尾,并且看起来像以下内容:
#define Macro(OTHER, ...) \
functionBeingUsed(__VA_ARGS__); \
OTHER;
Macro(int i = 0, 1, 2, 3, 4);
答案 2 :(得分:0)
我相信唯一的答案是使用多个宏
#define MacroBegin \
\\PreFunction
#define MacroEnd \
\\PostFunction
MacroBegin
functionBeingCalled(1,2,3,4);
MacroEnd
答案 3 :(得分:0)
要区分哪些逗号属于宏本身以及哪些属于所调用的函数,必须将函数参数包装在括号中,例如:
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 ();
...;
答案 4 :(得分:0)
为保持语法,您可以执行以下操作:
#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);