C ++中的变量参数函数问题

时间:2010-06-18 01:45:14

标签: c++ variadic-functions

我正在尝试在C ++中创建一个可变长度函数(显然,heh),而我现在所拥有的功能,但仅适用于第一个参数。如果有人可以请让我知道如何使用所有通过的论点,我会非常感激。

代码:

void udStaticObject::accept( udObjectVisitor *visitor, ... )
{
    va_list marker;
    udObjectVisitor *i = visitor;
    va_start( marker, visitor );
    while( 1 )
    {
        i->visit_staticObject( this );
//the if here will always go to the break immediately, allowing only 
//one argument to be used
        if( ( i = va_arg( marker, udObjectVisitor* ) ) )
            break;
    }
    va_end( marker );
}

根据我过去的帖子以及我提供的任何帮助帖子,可能会提供一些我没有提供的信息,您需要知道这些信息才能提供帮助。如果我忘了什么,我会提前道歉,请告诉我您需要知道的内容,以便提供相关信息。

2 个答案:

答案 0 :(得分:5)

如果使用可变参数函数,则需要一些方法来告诉函数传递了多少个参数。例如,printf()和friends会为每个传递的参数采用包含格式说明符的格式化字符串,并计算格式说明符的数量以确定传递的参数数量。

传递指针列表时,可以通过传入空指针作为最后一个参数来“更简单地”完成此操作。这样,您只需读取参数,直到到达空指针。

但是,您应该认真考虑使用可变参数函数。您可以通过将指针向量作为参数并迭代该向量的内容来完成相同的行为。有许多原因可以解释为什么这比使用可变函数要好:

  • Variadic功能绝对没有类型安全性。当您将参数传递给可变参数函数时,会丢失有关参数的任何和所有类型信息,因此,例如,函数的调用者可以传递数值而不是指针,并且您永远无法告诉函数内部

  • 使用可变参数解决方案,调用者必须正确指出参数的数量。如果调用者在末尾省略了空指针(或者错误地告诉你函数有多少参数)并且你尝试读取的参数多于传递的参数,那么你最终会得到未定义的行为。现在你可能会说“嗯,这不难忘记”,但不可避免地,有人会忘记或搞砸它并调试这类问题是一种殴打。

  • 采用向量并迭代其内容的解决方案实现起来更简单,更容易调试,而且在C ++中更加惯用。

如果在使用可变参数函数和不使用可变参数函数之间存在选项,则不应使用可变参数函数(我承认,我从未在任何C ++代码中编写可变参数函数写的,虽然我在C中写了一些。)

答案 1 :(得分:1)

也许测试是倒退的?试试这个:

    if( ( i = va_arg( marker, udObjectVisitor* ) ) != NULL )
        break;