通过宏将函数参数传递给函数

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__)

Demo

但将语法更改为更简单:

#define Macro(PARAMS, OTHER)  \
    functionBeingUsed PARAMS; \
    OTHER;

Macro((1,2,3,4), int i = 0);