Pass a function with undetermined number of arguments and call it with the variadic arguments

半城伤御伤魂 提交于 2019-12-10 17:52:11

问题


I'd like to create a function "lazy" which accepts a function with an undetermined number of arguments as parameter. What type do I need or which casts have to be done?

Then I want to execute that thing later in function "evaluate". How do I then pass the arguments I passed before to the "lazy" function to the passed function pointer?

Some code to illustrate my problem:

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

Or is something like this just impossible? Which other possibilities exist?


回答1:


You can't expand a va_list into separate arguments. The function you want to call have to be able to take a va_list as argument. See e.g. printf versus vprintf.


Also, as noted by caf, you can't store a va_list, as the arguments "pointed" to by it will not be valid once the lazy function returns. Attempting to use the va_list will lead to undefined behavior and all kinds of weirdness.



来源:https://stackoverflow.com/questions/19681025/pass-a-function-with-undetermined-number-of-arguments-and-call-it-with-the-varia

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!