C vararg递归函数:语法是什么?

时间:2017-10-05 07:21:03

标签: c variadic-functions

我正在尝试使用C中的变量args创建一个recusive函数,我似乎无法在写入递归调用时传递args。

这是我输入的内容

void f(const char* s, ...) {
        va_list args;
        va_start(args, s);
        f(s,args);
        va_end(args);
    }
}

(当然,不介意无限调用堆栈,这不是重点,所以我放弃了代码中的所有其他方面)

1 个答案:

答案 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宏复制整个参数列表。