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

标签 c function pointers dynamic call

我想动态调用 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 来完成,但不是那么简单也不是那么快:

  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. 创建接口(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;
    }
    
  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 - 没有函数指针的动态函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15373452/

相关文章:

c - OpenSSL的AES_ctr128_encrypt()的参数详情

c - 两个带有 void 和空参数列表的函数声明

c - 赋值从 int 中生成指针 w/out a cast

c++ - 指向重载函数的指针

pointers - 去指针第一次赋值

c - 如何从函数返回字符串数组

检查下一行

c - 如何记住缓冲区中的多个索引以便稍后访问它们以进行一一修改...记住优化

r - 如何提取函数内设置的默认值?

java - Spark SQL 长 double 值带有指数