是否有可能在C中具有可变参数函数且没有非可变参数?

我有以下function:

void doStuff(int unusedParameter, ...) { va_list params; va_start(params, unusedParameter); /* ... */ va_end(params); } 

作为重构的一部分,我想删除未使用的参数,而不另行更改函数的实现。 据我所知,当你没有要引用的最后一个非变量参数时,不可能使用va_start 。 有没有办法解决?

背景:它实际上是一个C ++程序,所以我可以使用这里建议的一些运算符重载魔法,但我希望此时不必更改接口。

现有函数通过要求变量参数列表以空值终止并扫描NULL来完成其工作,因此它不需要一个前导参数来告诉它有多少参数。

回应评论:我不必删除未使用的参数,但如果有一个干净的方法,我会这样做。 我希望有一些我想念的简单。

您可以选择保留原样并使用va_list ,别名(如果它是GCC),或其他人指出的,或者执行exec(2)接口的行 – 传递一个需要NULL终止符的指针数组:

 /* \param args NULL-terminated array of * pointers to arguments. */ void doStuff( void* args[] ); 

无论哪种方式,重构接口以某种方式利用类型系统会更好 – 可能在使用的确切参数类型上重载:

 void doStuff( int ); void doStuff( const std::string& ); void doStuff( const MyFancyAppClass& ); 

希望这可以帮助。

在GCC中,您有一个解决方法:您可以定义具有可变数量参数的宏,然后在扩展中添加虚拟参数:

 #define doStuff(...) realDoStuff(0, __VA_ARGS__)