Bal*_*zar 5 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;
}
Run Code Online (Sandbox Code Playgroud)
该代码在我的系统上编译,并且输出符合预期:
Next arg 12
Next arg 13
Run Code Online (Sandbox Code Playgroud)
那么,这种做法可以吗?我搜索了列表,发现将va_list移交给下一个函数后,调用函数中va_list的内容未定义。这对我的用法无关紧要,因为在将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从开头传递到另一个函数时,就会出现问题。