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

时间:2010-04-12 12:51:05

标签: c variadic-functions

我有以下功能:

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

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

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

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

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

2 个答案:

答案 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& );

希望这有帮助。