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;
}

我知道我必须使用 a va_list,但我不知道如何通过传递参数的指针调用函数。

所以,伙计们,有什么想法吗?

4

1 回答 1

5

坏消息是,这在 C 中是不可能的,即使在不可移植的 C 中也是如此。(GCC 有一些扩展,听起来好像它们可以完成这项工作,但它们在一般情况下不起作用。)有必要编写汇编语言填充程序。

好消息是,其他人已经为您编写了垫片:看看libffi。(此处为手册。如果可以避免,请不要使用“闭包”API。)

于 2012-08-30T23:13:41.623 回答