我有以下功能:
void doStuff(int unusedParameter, ...)
{
va_list params;
va_start(params, unusedParameter);
/* ... */
va_end(params);
}
作为重构的一部分,我想删除未使用的参数,否则不会改变函数的实现。据我所知,当你没有要引用的最后一个非变量参数时,不可能使用va_start
。有没有办法解决这个问题?
背景:它实际上是一个C ++程序,所以我可以使用一些运算符重载魔法,如建议here,但我希望此时不必更改接口。
现有函数通过要求变量参数列表以空值终止并扫描NULL来完成其工作,因此它不需要一个前导参数来告诉它有多少参数。
回应评论:我没有有删除未使用的参数,但如果有一个干净的方法,我会这样做。我希望有一些我想念的简单。
答案 0 :(得分:13)
在GCC中,您有一个解决方法:您可以定义一个具有可变数量参数的宏,然后在扩展中添加虚拟参数:
#define doStuff(...) realDoStuff(0, __VA_ARGS__)
答案 1 :(得分:3)
您的选择是保持原样并使用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& );
希望这有帮助。