#define M_RETI_ARG27(x,y,z,aa, ...) aa#define M_RET_ARG27(...) M_RETI_ARG27(__VA_ARGS__)#define M_COMMA_P(...) M_RET_ARG27(__VA_ARGS__, 1, 1, 0, useless)#define M_EMPTYI_DETECT(...) 0, 1,#define M_EMPTYI_P_C1(...) M_COMMA_P(M_EMPTYI_DETECT __VA_ARGS__ () )#define EX#define empty(x)#define fnlike(x) yeah x/* If the following macro is called with empty arg (X183), the use of 'x' between fnlike and '(' doesn't hinder the recognition of this being a further fnlike macro invocation. */#define usefnlike(x) fnlike x (x)X181 M_EMPTYI_P_C1()X182 M_EMPTYI_P_C1(x)X183 usefnlike()#define ABC(x) ABC : x#define A(a,b,c) a ## b ## c#define B(a,b,c) A(a,b,c)#define C(a,b,c) a b cB( C(A,C(,,),), C(B(,,),B,B(,,)), C(B(,,),B(,,),C) )/* */(a b c)#define TEST(x) TEST : x#define K(a,b) a ## b#define L(a,b) K( TE a , b ST )L(,)(t e s t)
#define M_RETI_ARG27(x,y,z,aa, ...) aa
#define M_RET_ARG27(...) M_RETI_ARG27(__VA_ARGS__)
#define M_COMMA_P(...) M_RET_ARG27(__VA_ARGS__, 1, 1, 0, useless)
#define M_EMPTYI_DETECT(...) 0, 1,
#define M_EMPTYI_P_C1(...) M_COMMA_P(M_EMPTYI_DETECT __VA_ARGS__ () )
#define EX
#define empty(x)
#define fnlike(x) yeah x
/* If the following macro is called with empty arg (X183), the use
of 'x' between fnlike and '(' doesn't hinder the recognition of this
being a further fnlike macro invocation. */
#define usefnlike(x) fnlike x (x)
X181 M_EMPTYI_P_C1()
X182 M_EMPTYI_P_C1(x)
X183 usefnlike()
#define ABC(x) ABC : x
#define A(a,b,c) a ## b ## c
#define B(a,b,c) A(a,b,c)
#define C(a,b,c) a b c
B(
C(A,C(,,),),
C(B(,,),B,B(,,)),
C(B(,,),B(,,),C)
)/* */(a b c)
#define TEST(x) TEST : x
#define K(a,b) a ## b
#define L(a,b) K( TE a , b ST )
L(,)(t e s t)