0

私はそのような共通の親機能を持っていることを探しています

void main (param 1, param 2)
{
    <stuff to do>
    param1();
    print("The function %s was called", param 2);
    <more stuff to do>
}

ここで、param 1 は呼び出される関数の名前になり、param 2 は説明テキストになります。param 2 は簡単で、解決しましたが、関数名を渡して同じ親関数から関数を呼び出す方法については不明です。親関数が行うことは他にもいくつかありますが、呼び出す関数のみが異なる複数の親関数や、switch ステートメントを持つ単一の親を使用する代わりに、この方法が可能であれば好まれます。何かご意見は?

4

5 に答える 5

5

パラメータ 1 に実際に渡したいのは、関数の名前ではなく、呼び出したい関数への関数ポインタです。

関数ポインターに関するこのチュートリアルをご覧ください。

于 2009-05-29T14:22:40.313 に答える
0

このようなもの?

#include <stdio.h>
void foo(void) { printf("foo\n"); }
void bar(void) { printf("bar\n"); }
static inline void parent(void func(), const char *msg)
{
    /* do stuff */
    func();
    printf("%s called\n", msg);
    /* more stuff */
}
int main(void)
{
    parent(foo, "test1");
    parent(bar, "test2");
    return 0;
}
于 2009-05-29T23:43:38.667 に答える
0

これは何語ですか?関数がこの言語の第一級市民でない場合、それはできません

Java のようなものであれば、インターフェースを実装するオブジェクトを渡して、そのオブジェクトでその関数を呼び出すだけで、これを回避できます。

于 2009-05-29T14:00:33.727 に答える
0

関数ポインターは良いことだと思いますが、プリプロセッサを活用して、必要なことを実行できる場合があります...(ただし、関数ポインターの使用方法を学ぶことは良いことです)...

つまり、param2 が静的に知られているものである場合、関数ポインターを持つことはかなり役に立ちません。動的な値があり、プログラムの実行中に param2 = foo を指定してから param2 = bar を指定したい場合は、関数ポインターの方が適しています。 ...

実際に別の関数プロトタイプが必要ですか、それとも次のようなものがありますか...

#ifdef BAR
 void foo() { whatever(); }
#elif defined(FOO)
 void foo() { whocares(); }
#else
 #define foo() do{} while(0)
#endif

常に同じ本体を持ちますが、コマンドラインで異なる -D を指定します...

于 2009-05-29T15:40:42.107 に答える
-2

これは、一般に、C およびコンパイル済み言語で行うのは容易ではありません。Windowsでは、次のようなものがあります(長い間です):

typedef void(* simple_void_function )()
HMODULE exe_module = GetModuleHandle( NULL ); // not sure about this
simple_void_function = GetProcAddress( exe_module, param1 );
(*simple_void_function)();

引数を手動でスタックにプッシュする場合、実際の関数呼び出しシグネチャはより柔軟になります。

于 2009-05-29T14:21:44.183 に答える