繁体   English   中英

C - 没有函数指针的动态函数调用

[英]C - dynamic function call without a function pointer

我想动态地调用C函数(例如,形成stdlib,math ...)。 这意味着我的C程序只知道指向随机函数(例如printf )及其签名(编码为char数组: char * ,...)的指针。

我的目标是一个reflectCall函数,它获取一个指向函数( &printf )的指针,一个签名(以某种方式编码在char[] ),参数作为long[]long不是实际的数据类型,一个long值可以也表示双值,指针,...)。

因此,我的反射函数的签名如下所示:

long reflectCall(void *funcPointer, char[] types, long[] args)

该函数应该对函数*funcPointer进行实际调用,最后返回其结果。

结果,我无法创建指针指针; 比如这个:

int (*functionPtr)(int,int);

任何人都可以给我一个提示如何解决这个问题或建议任何参考实现?

它可以在纯C中完成,但它不是那么简单而且不那么快:

  1. 为要调用的所有函数创建包装函数,例如:

     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; } 
  2. 指向包装函数的指针:

     typedef int (*TWrapper)(const char*,long*,long*); 
  3. 为包装函数创建表结构:

     struct STableItem{ const char *strName; TWrapper pFunc; }; 
  4. 创建一个表:

     STableItem table[] = { {"printf", &WrapPrintf}, {"foo", &WrapFoo}, {NULL, NULL} }; 
  5. 创建接口以从表中调用任何函数(按名称搜索函数并调用它):

     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; } 
  6. 最后拨打电话:

     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不提供这样做的设施。 您必须在特定于平台的ASM中编写函数体。

我建议你看看libffi,它是否符合你的需求......

http://sourceware.org/libffi/
http://en.wikipedia.org/wiki/Libffi

正如其他地方所解释的那样,没有办法真正动态地做到这一点。 但是,如果您希望使用指针构建函数表,并使用某种字符串或索引来描述您想要执行的操作,那么这将以可移植的方式实现。 作为各种解析和其他“基于命令等的运行代码”的解决方案,这并不罕见。

但它确实要求你使用某种类型的函数指针[或者在某些时候将你的void *转换成一个]。 在C中没有其他(甚至几乎)可移植的方式动态调用函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM