1

「関数呼び出し元」関数を作成する必要があります。これは、汎用関数ポインター ( void *) と可変数の引数を引数として受け取り、この関数を呼び出して引数を渡し、戻り値への汎用ポインターを返す必要があります。ただし、このエントリ関数ポインタは、一定数の引数を持つ関数であっても、任意の種類の関数 (戻り値の型を含む) を指す場合があります。次のようになります。

void * function_caller(void * function_pointer, ...) {
  void * returning_value;

  // Call the function and get the returning value

  return returning_value;   // this returning value will be properly casted outside
}

このようにして、次のコードが機能します。

int function1(int a, char b) {
  // ...
}

void function2(float c) {
  // ...
}

float function3() {
  // ...
}

int main() {
  int v1;
  float v3;

  v1 = *(int *) function_caller((void *) &function1, 10, 'a');  // Which would be equivalent to v1 = function1(10, 'a');
  function_caller((void *) &function2, 3.0);    // Which would be equivalent to function2(3.0);
  v3 = *(float *) function_caller((void *) &function3); // Which would be equivalent to v3 = function3();

  return 0;
}

を使用する必要があることはわかっていますがva_list、引数を渡すポインターによって関数を呼び出す方法がわかりません。

それで、皆さん、何か考えはありますか?

4

1 に答える 1

5

悪いニュースは、これはCでは不可能です。移植性のないCでも不可能です(GCCには、この仕事をしているように聞こえる拡張機能がありますが、一般的なケースでは機能しません)。アセンブリ言語のシムを作成する必要があります。

良いニュースは、他の人がすでにあなたのためにシムを書いているということです:libffiを見てください。(ここのマニュアル。回避できる可能性がある場合は、「クロージャー」APIを使用しないでください。)

于 2012-08-30T23:13:41.623 に答える