传递具有未确定数量的参数的函数,并使用可变参数调用它

时间:2013-10-30 11:31:26

标签: c parameter-passing variadic-functions dynamic-function

我想创建一个函数“lazy”,它接受一个参数数量不确定的函数。我需要什么类型或必须进行哪些演员表?

然后我想在函数“evaluate”中执行该事情。然后我如何将之前传递的参数传递给“lazy”函数传递给函数指针?

一些代码来说明我的问题:

char *function_I_want_to_call(void *foo, type bar, ...);
// the arguments are unknown to lazy() and evaluate()

typedef struct {
    ??? func;
    va_list args;
} lazy_fcall;

void lazy(lazy_fcall *result, ??? func, ...) {
// which type do I need here?
    va_start(result->_args, fund);
    result->func = func;
}

void *evaluate(lazy_fcall *to_evaluate) {
    return to_evaluate->func(expand_args(to_evaluate->args));
    // what do I have to write there to expand the va_list? It's C, not C++11...
}

int main () {
    lazy_fcall lazy_store;
    lazy(&lazy_store, function_I_want_to_call, "argument_1", "argument_2");
    // ...
    printf("%s", (char *)evaluate(&lazy_store));
}

或者这样的事情是不可能的?还有哪些其他可能性?

1 个答案:

答案 0 :(得分:3)

您无法将va_list扩展为单独的参数。您要调用的函数必须能够以va_list作为参数。参见例如printfvprintf


另外,正如caf所指出的那样,你不能存储va_list,因为一旦lazy函数返回,它所指向的参数将无效。尝试使用va_list会导致未定义的行为和各种怪异。