我想动态调用 C 函数(例如形成标准库、数学...)。这意味着我的 C 程序只知道指向随机函数的指针(例如 printf
)及其签名(编码为 char 数组:char *
, ...)。
我的目标是一个 reflectCall 函数,它获取指向函数的指针 (&printf
)、签名(以某种方式编码在 char[]
中)和参数作为 long[]
(long
不是实际的数据类型,一个 long 值也可以表示一个 double 值、指针等)。
因此,我的反射函数的签名如下所示:
long reflectCall(void *funcPointer, char[] types, long[] args)
该函数应该执行函数 *funcPointer
的实际调用并最终返回其结果。
因此,我不能不创建指针指针;例如像这样:
int (*functionPtr)(int,int);
谁能给我提示如何解决这个问题或建议任何引用实现?
最佳答案
可以用纯 C 来完成,但不是那么简单也不是那么快:
为您要调用的所有函数创建包装函数,例如:
int WrapPrintf(const char* types,long* args,long* results) { // Function specific code, in this case you can call printf for each parameter while(*types) { switch(*types){ case 'i': printf("%d",(int)*args); break; case 'c': printf("%c",(char)*args); break; // .. and so on } ++types; ++args; } // Return number of filled results return 0; } int WrapFoo(const char* types,long* args,long* results) { // ..function specific code.. return 0; }
指向包装函数的指针:
typedef int (*TWrapper)(const char*,long*,long*);
为包装函数创建表结构:
struct STableItem{ const char *strName; TWrapper pFunc; };
创建一个表:
STableItem table[] = { {"printf", &WrapPrintf}, {"foo", &WrapFoo}, {NULL, NULL} };
创建接口(interface)以调用表中的任何函数(按名称搜索函数并调用它):
int DynamicCall(const char *func_name,const char* types,long* args,long* results) { int k; for(k=0;table[k].strName != NULL;++k){ if(strcmp(func_name,table[k].strName) == 0){ return table[k].pFunc(types,args,results); } } return -1; }
最后打个电话:
long args[] = {123,'b'}; long results[8]; // not nice but just for an example int res_count = DynamicCall("printf","ic",(long*)args,(long*)results);
注意:使用哈希函数可以更快地搜索名称
关于C - 没有函数指针的动态函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15373452/