是否可以递归解析va_list中的参数
Is it OK to recursively parse the args in a va_list?
假设我想创建一个递归解析可变参数列表的函数,让函数的每次调用读取下一个参数?将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从开头传递到另一个函数时,会出现此问题。
相关文章:
- C2664 无法从'initializer list'转换参数
- <string> 如何在使用 SWIG 时将 int 数组和 List 作为参数传递给 C# C++
- 当通知迭代器参数初始化为空列表的开头时,list::insert 行为是什么?
- 如何在C++中设置std::list参数的默认值?
- 如何使用list<T*>作为方法的参数?
- "默认参数":无法从'initializer list'转换为'std::initializer_list'
- 如何从 JNI 传递 std::list 参数来调用本机 C++ 函数
- 在C++标准中,当我同时使用 list.begin() 作为 list.splice() 的第一个和第三个参数时,为什么会发生无限循环
- 将 std::list<boost::any> 作为函数的参数传递
- 使用可变参数模板制作类似元组的编译时"linked-list"
- 错误:"模板<类_Tp、类_Alloc>类 std::list"的模板参数列表中参数 1 的类型/值不匹配
- 如何使用list::sort()对STL列表对象进行排序,同时将自定义排序函数作为参数传递给list::排序
- 错误:'需要模板参数;struct List'
- C++在函数中创建std::list并通过参数返回
- 带有参数的 func return list (int arry[int]<int>, int array[int])
- 将C++转换为Python:将std::list作为参数返回给Python
- 为什么std::list要不带参数地调用我的分配器?
- 如何通过List
从Java到c++的std::vector函数参数使用JNA - 为什么std::list中的单参数构造函数定义为显式
- Std::list抱怨缺少第二个模板参数(allocator)