是否可以递归解析va_list中的args?

时间:2012-04-15 17:23:25

标签: c++ variadic-functions

假设我想通过让函数的每次调用读取下一个参数来创建一个递归解析可变参数列表的函数?在将va_list交给下一个函数之后,我不打算继续在调用函数中使用va_list。以下代码是否正确:

void VarArgRecursive( va_list args ) {
    int nextArg = va_arg(args, int);
    if( nextArg != -1 ) {
        printf("Next arg %d\n", nextArg);
        VarArgRecursive(args);
    }
}

void VarArgFunc( int firstArg, ... ) {
    va_list args;
    va_start(args, firstArg);
    VarArgRecursive(args);
    va_end(args);
}

int main (int argc, char * const argv[]) {

    VarArgFunc(20, 12, 13, -1);

    return 0;
}

代码在我的系统上编译,输出符合预期:

Next arg 12
Next arg 13

那么,这种做法可以吗?我搜索了列表,发现在将va_list交给下一个函数后,调用函数中的va_list的内容是未定义的。这对我的用法无关紧要,因为在将其交给下一个(实际上,相同的)函数之后我不会继续使用va_list。我也检查了这个页面:

http://c-faq.com/varargs/handoff.html

...这表明我将va_list移交给下一个函数的方式是可以的。它没有说的是,在读取一个arg之后将va_list交给另一个函数是否可以,并期望被调用的函数读取下一个arg。如果这个问题有c ++特定的答案,那也没问题,因为它将在c ++程序中使用。

1 个答案:

答案 0 :(得分:1)

你可以多次传递它,但你不能多次“使用”va_list。在使用时,可以修改va_list,并且根据C ++规范再次使用它是未定义的行为。

如果您想多次使用它,请在使用之前调用va_copy克隆va_list,然后传递副本。

但是,在您的情况下,您所做的事情是可以接受的。当您尝试将va_list 从开头传递到另一个函数时,会出现问题。