Передача параметров функции в функцию через макрос - PullRequest
0 голосов
/ 26 июня 2018

Я хочу создать макрос, в котором один из параметров является параметрами для функции, используемой в макросе.

#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.

Ответы [ 5 ]

0 голосов
/ 26 июня 2018

Чтобы сохранить синтаксис, вы можете сделать что-то вроде:

#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);
0 голосов
/ 26 июня 2018

Чтобы различить, какие запятые принадлежат самому макросу, а какие принадлежат вызываемой функции, вы должны заключить параметры функции в круглые скобки, например:

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 ();
...; 
0 голосов
/ 26 июня 2018

Я считаю, что единственный ответ - использовать несколько макросов

#define MacroBegin \
   \\PreFunction

#define MacroEnd \
   \\PostFunction

MacroBegin
functionBeingCalled(1,2,3,4);
MacroEnd
0 голосов
/ 26 июня 2018

Всякий раз, когда вам нужно сделать что-нибудь нетривиальное с препроцессором, вы должны немедленно перейти в библиотеку 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 и разрешить использование пропущенных скобок.

0 голосов
/ 26 июня 2018

Невозможно сделать то, что вы описали.Тем не менее, вы можете сделать нечто подобное с variadic macros .Вам нужно будет поставить часть PARAMS в конце, и это будет выглядеть следующим образом:

#define Macro(OTHER, ...) \
    functionBeingUsed(__VA_ARGS__); \
    OTHER;

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