我可以在中间而不是结尾使用__VA_ARGS定义可变参数C预处理器宏吗?

如果我这样做,海湾合作委员会会抱怨:
#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;
}

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...