我正在尝试使用C中的变量args创建一个recusive函数,我似乎无法在写入递归调用时传递args。
这是我输入的内容
void f(const char* s, ...) {
va_list args;
va_start(args, s);
f(s,args);
va_end(args);
}
}
(当然,不介意无限调用堆栈,这不是重点,所以我放弃了代码中的所有其他方面)
答案 0 :(得分:4)
va_list
是一种实现定义的方法,用于访问您在编译时不知道的函数的参数 - 例如(取决于体系结构)指针在堆栈框架中的某处功能。你不能用它代替实际的论点。
如果需要传递可变参数,典型的方法是在一个带有va_list
参数的函数中实现。命名该函数的惯用方法是在其名称前加v
。所以最后,你有两个功能:
void vf(const char* s, va_list ap) {
// your logic ...
vf(s, ap); // recursive call
}
// just a wrapper:
void f(const char* s, ...) {
va_list args;
va_start(args, s);
vf(s, args);
va_end(args);
}
请注意,这会将引用传递给最初调用函数的参数。如果这是您的逻辑问题,您可以使用va_copy
宏复制整个参数列表。