たとえば、配列に何らかの形で格納された引数のリストがあるとします。
関数 pointer が与えられた場合、格納されている引数のリストを渡して関数を呼び出すにはどうすればよいですか?
配列を引数として渡そうとはしていません。わかりましたか?その各要素を引数として渡したい。配列は単なる例です。引数をタプル構造に格納できます。また、手元に関数ポインターがあり、文字列形式の署名がある可能性があることを確認してください。可変長リストを処理できる関数を定義しようとしているだけではありません。
私がそれを行う唯一の方法は、アセンブリ(by __asm push
et al。)またはこれを使用することです:
void (*f)(...);
int main()
{
f = <some function pointer>;
int args[]; <stored in a array, just to illustrate>
int num_args = <some value>;
switch(num_args)
{
case 0:
f();
break;
case 1:
f(args[0]);
break;
case 2:
f(args[0], args[1]);
break;
/* etc */
}
return 0;
}
私はこのアプローチがあまり好きではありません...
別のポータブルで短い形式はありますか?
いくつかのスクリプト言語は、C 関数を呼び出すことができます。
Python や Ruby などのスクリプト言語はどのようにそれを行うのでしょうか? 移植可能な方法でどのように実装しますか? 最終的に、いくつかのプラットフォームまたは上記のアセンブリを使用するだけですか?
スクリプト言語から C へのパラメータ マーシャリングやその他の詳細については質問していないようです。最終的に内部的に、スクリプト言語による C 関数の呼び出しがどのように構築されるかだけに関心があります。
編集
質問のタイトルはそのままにしますが、質問のより良い方法は次のとおりだと思います。
実行時にのみ使用可能なポインターとシグネチャーを使用して C 関数を呼び出す方法は?
アップデート
コールアウトは通常の関数呼び出しです。動的設定では、(バイナリ) 入力/出力タイプを指定する「呼び出しインターフェイス」オブジェクトを作成します。このオブジェクトを任意の関数ポインタおよび入力値の配列とともに使用して、関数へのコールアウトを実行し、その結果を取得できます。これを行うには、スタックを操作し、関数がどのように呼び出されるかを知る必要があります。これらは、libffiが処理する詳細です。
@AnttiHaapala にlibffiを検索、検出、および指定していただきありがとうございます。それは私が探していたものであり、多くのスクリプト言語で使用されており、いくつかのアーキテクチャとコンパイラにまたがって実装されたポータブル ライブラリです。