4

パラメータとして未定の数の引数を持つ関数を受け入れる関数「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));
}

それとも、このようなことは不可能ですか?他にどのような可能性がありますか?

4

1 に答える 1

3

va_listaを個別の引数に展開することはできません。呼び出したい関数はva_list、引数として取ることができる必要があります。printf対を参照してくださいvprintf


また、 caf で指摘されているように、 a を格納することはできません。関数が戻るva_listと、それによって「指された」引数が無効になるためです。lazywillを使用しようとすると、va_list未定義の動作とあらゆる種類の奇妙さにつながります。

于 2013-10-30T11:34:02.503 に答える