Препроцессор C заменит несколько аргументов - PullRequest
0 голосов
/ 24 ноября 2018

Я хочу заменить FUNC(x1, x2, x3, etc..) на

FUNC2(x1);
FUNC2(x2);
FUNC2(x3);
etc..

Я пытался, но потерпел неудачу с varargs.И FUNC, и FUNC2 должны быть макросами.

1 Ответ

0 голосов
/ 25 ноября 2018

Это выполнимо, но нетривиально.

Я использую макрос BX_foreach(Joiner,Function,...) для этой реализации следующим образом (сгенерировано около 8 аргументов - вы должны быть в состоянии выяснить, как сгенерировать его длябольше):

#define BX_foreach_(N, Join, What, ...) BX_paste(BX_cat(BX_foreach_, N)(Join, What, __VA_ARGS__))
#define BX_cat(X,Y)  BX_cat_(X,Y) //{{{
#define BX_cat_(X,Y) X##Y //}}}
#define BX_call_first(Fn,...) Fn ( __VA_ARGS__ )
#define BX_paste(...) __VA_ARGS__

#define BX_argc(...) BX_argc_(X,__VA_ARGS__) //{{{
#define BX_argc_(...) BX_argc__(,__VA_ARGS__,8,7,6,5,4,3,2,1,0,0)
#define BX_argc__(_,_0,_1,_2,_3,_4,_5,_6,_7,_8,Cnt,...) Cnt //}}}
#define BX_foreach_1(Join, What,  x) BX_call_first(What,  x)
#define BX_foreach_2(Join, What,  x,...)BX_call_first(What,x) Join BX_foreach_1(Join, What,  __VA_ARGS__)
#define BX_foreach_3(Join, What,  x,...)BX_call_first(What,x) Join BX_foreach_2(Join, What,  __VA_ARGS__)
#define BX_foreach_4(Join, What,  x,...)BX_call_first(What,x) Join BX_foreach_3(Join, What,  __VA_ARGS__)
#define BX_foreach_5(Join, What,  x,...)BX_call_first(What,x) Join BX_foreach_4(Join, What,  __VA_ARGS__)
#define BX_foreach_6(Join, What,  x,...)BX_call_first(What,x) Join BX_foreach_5(Join, What,  __VA_ARGS__)
#define BX_foreach_7(Join, What,  x,...)BX_call_first(What,x) Join BX_foreach_6(Join, What,  __VA_ARGS__)

С его помощью вы можете сделать:

#define FUNC(X) foo(X)
BX_foreach(;,FUNC,x1,x2,x3)

и увеличить его до

foo(x1) ; foo(x2) ; foo(x3)
...