简单如下:
#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)
因此,如果您有这些宏,它们将按所述扩展:
FOO(World, !) // expands to FOO2(World, !)
FOO(foo,bar,baz) // expands to FOO3(foo,bar,baz)
如果你想要第四个:
#define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO4, FOO3, FOO2)(__VA_ARGS__)
FOO(a,b,c,d) // expands to FOO4(a,b,c,d)
当然,如果你定义FOO2
, FOO3
and FOO4
,输出将被定义的宏的输出替换。