c - 传递一个参数数量不确定的函数,并使用可变参数调用它

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

我想创建一个“惰性”函数,它接受一个参数数量不确定的函数作为参数。我需要什么类型或必须完成哪些转换?

然后我想稍后在函数“evaluate”中执行那个东西。然后如何将之前传递给“惰性”函数的参数传递给传递的函数指针?

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

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));
}

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

最佳答案

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


此外,如 caf 所述,您不能存储 va_list,因为一旦 lazy 函数返回,它“指向”的参数将无效.尝试使用 va_list 将导致未定义的行为和各种怪异现象。

关于c - 传递一个参数数量不确定的函数,并使用可变参数调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19681025/

相关文章:

c - C 中检查登录信息的结构

c - Scanf 意外返回 EOF

python - Python 复杂参数传递需求的解决方案是什么?

php - PHP 中的可变参数函数和类型提示

c - DevCPP 的库窗口

c - 完成任务后如何结束子进程?

java - 对象的接口(interface)和参数存在问题

在 JSON 参数中接受元组的 Pythonic 方式

c - 可变函数

c++ - 工作函数重载如何使用可变参数进行解析?