1

これが悪い考えである理由を私は知っています、そしてこれがC ++テンプレートが作成された理由であることも知っています、しかし私は楽しみと学習のためにCでそれをしています。

私はPythonをアプリケーションに埋め込んでおり、アプリケーションの実行時に呼び出すことができるように、特定のC関数を任意のタイプで登録できるようにしたいと考えていました。このため、それらへのポインタが(単純なvoid *として)格納されます。

いくつかの基本的なマクロの楽しみで、これらの関数について必要なすべての情報を取得し、それも格納しました-関数ポインター、戻り値のサイズ(およびそれが無効の場合)、引数の数、およびそれらの各サイズ。

そのため、私は最終段階で立ち往生しています。これは、適切なデータを使用した関数ポインターの実際の呼び出しです。私はこの種のことが可能であるとかなり確信しています(私は自分の時間にスタックエラーを引き起こしました)が、もっと...合法的な方法があるかどうか疑問に思いました。

理想は次のようになると思います。

void call_function(void* function, void* return, void* arg_data, int arg_data_size);

そのようなものは存在しますか?

ありがとう

4

1 に答える 1

1

引数void* (*f) (void*);を取り、戻り値を返す関数を指す関数ポインタを宣言できます。これを の最初のパラメータに入れることができます。void*void*call_function

次に、次のように呼び出しcall_functionます。

void* function(void*);
ret_type ret;
arg_type arg_data;
call_function(&function, (void*)&ret, (void*)&arg_data, sizeof(arg_data));

whereは内部でarg_type使用する実際の引数の型であり、 の戻り値の実際の型です。functionret_typefunction

注: 戻り値の型のサイズも指定したい場合があります。

注: これは、1 つの引数の任意の関数で機能します。ソリューションは、 の固定/既知の数の引数に拡張できますがfunction、未知の数の引数を処理することはできません。

注:キーワードのreturnように、2 番目のパラメーターに名前を付けることはできません。return

于 2012-04-09T20:30:45.670 に答える