在c中有一个干净的方法来创建一个函数来调用具有不同参数的其他函数吗?

时间:2014-04-10 00:11:58

标签: c function pointers

我正在编写一个库的接口,我有很多代码块,如下所示:

result = library_function(arg1, arg2, arg3,...,argn);
printf("library_function result: %s", result_to_string(result));

我真的希望能够做更多的事情:

function_caller(&library_function, arg1, arg2, arg3,...,argn);

function_caller(&library_function(arg1, arg2, arg3,...,argn));

我知道如何设置指向另一个函数的指针,但不知道如何解析未知数量的未知类型的参数。我可以通过类型转换来做到这一点,但这不像现在的情况那么吸引人,我承认这并不可怕,只是看起来很难看。

2 个答案:

答案 0 :(得分:2)

1 。除非您知道参数类型,否则可以使用宏来执行此操作。

#define function_caller(func, ...) do { \
    result = func(__VA_ARGS__); \
    printf("%s result: %s\n", #func, result_to_string(result)); \
} while (0)

你这样使用它:

function_caller(library_function, arg1, arg2, arg3, arg4);

还有其他方法可以做到,但它们非常不便携。宏需要C99。 C99支持目前无处不在,但尽管标准时代,MSVC仍然缺乏C99支持。

1 "叹息"因为我建议一个宏。通常应该避免使用宏,并且可能导致代码难以阅读。

答案 1 :(得分:0)

在Linux(以及其他一些系统)上,您也可以使用libffi

  

libffi库为各种调用约定提供了可移植的高级编程接口。这允许程序员在运行时调用由调用接口描述指定的任何函数。

     

FFI代表外部功能接口。

LibFFI知道精确的Application Binary Interface约定(对于Linux x86-64记录here)并且能够模仿任何函数的调用约定(您需要在运行时指定接口)那个功能)。

如果您的库很大且经常使用,您甚至可以考虑使用扩展自定义GCC到MELT,该扩展可以自动将gimple调用转换为某些函数(例如某种方面编程)。这可能需要一周的时间。