是否可以递归解析va_list中的参数

Is it OK to recursively parse the args in a va_list?

本文关键字:list 参数 va 递归 是否      更新时间:2023-10-16

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

void VarArgRecursive( va_list args ) {
    int nextArg = va_arg(args, int);
    if( nextArg != -1 ) {
        printf("Next arg %dn", 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移交给下一个函数的方式是可以的。它没有说的是,在读取一个参数后,是否可以将va_list交给另一个函数,并期望被调用的函数读取下一个参数。如果这个问题有特定于 c++ 的答案,那也没关系,因为它将在 c++ 程序中使用。

您可以随意传递它,但您不能多次"使用"va_list。使用时,va_list可能会被修改,根据C++规范,再次使用它是未定义的行为。

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

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