假设我想通过让函数的每次调用读取下一个参数来创建一个递归解析可变参数列表的函数?将 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++ 程序中使用。