我正在编写一个库的接口,我有很多代码块,如下所示:
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));
我知道如何设置指向另一个函数的指针,但不知道如何解析未知数量的未知类型的参数。我可以通过类型转换来做到这一点,但这不像现在的情况那么吸引人,我承认这并不可怕,只是看起来很难看。
答案 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调用转换为某些函数(例如某种方面编程)。这可能需要一周的时间。