c++ - 可以递归解析 va_list 中的参数吗?

标签 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

那么,这样的做法可以吗?查了一下list,发现把va_list交给下一个函数后,调用函数中va_list的内容是undefined的。这对我的使用无关紧要,因为在将 va_list 交给下一个(好吧,实际上是相同的)函数后,我不会继续使用它。我也检查了这个页面:

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

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

最佳答案

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

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

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

关于c++ - 可以递归解析 va_list 中的参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10164300/

相关文章:

c - C 中的 sprintf 和 unsigned int 数组

c++ - cout/cerr wrapper ostream 以最小的努力

c++ - 标识符未定义 C++ 即使我有 CPP 和头文件

c++ - 非默认运算符 <=> 在 C++20 中不会生成 == 和 !=

在运行时检查指针后面的数据以避免段错误 : (wchar_t *) vs. (char *)

c++ - 将可变参数列表插入 vector 中?

java - 如何向可变参数添加参数?

c++ - 如何同时别名和实例化模板函数?

c++ - gdb 调试器访问未找到的文件

c++ - 如何在Mac上使用C++创建图形