是否有可能在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__)