如果我这样做,海湾合作委员会会抱怨:
#define M(obj,met,...,contents) obj##_##met(const void * self,__VA_ARGS__) { \ contents \ }
给我这两个理由:
error: missing ')' in macro parameter list warning: __VA_ARGS__ can only appear in the expansion of a C99 variadic macro
显然,C99样式的可变参数宏在省略号之后立即期望右括号,有效地要求可变参数列表是宏的最后一个参数.我需要它在中间来产生我在上面的宏中描述的速记符号. GCC是否支持此功能,使用另一种(非C99)可变参数宏样式?我可以模仿它在其他地方做吗?我不希望最后的变量列表,它会让我的符号混乱.我只能使用GCC.
解决方法
不,你不能. ……必须出现在最后.
但你可以将M定义为
#define M(obj,...) obj##_##met(const void * self,__VA_ARGS__)
并用它作为
void M(foo,bar,int x,char y,double z) { content; }