Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 调用函数名,而不是函数指针_C_Ffi_Libffi - Fatal编程技术网

C 调用函数名,而不是函数指针

C 调用函数名,而不是函数指针,c,ffi,libffi,C,Ffi,Libffi,libffi的manpage提供了一个示例,本质上,该示例需要一个指向函数的指针 但是,如果我只知道函数的名称,但实际上没有一个指针(如果ffi在动态编程语言中使用,通常会发生这种情况),我该怎么办 比如说,我想做一些类似伪代码的事情: cif = null s = "Hello World" args = [] values = [] args[0] = ffi.type_pointer values[0] = address_of(s) if(ffi.prepare(cif, ffi.DEF

libffi的manpage提供了一个示例,本质上,该示例需要一个指向函数的指针

但是,如果我只知道函数的名称,但实际上没有一个指针(如果ffi在动态编程语言中使用,通常会发生这种情况),我该怎么办

比如说,我想做一些类似伪代码的事情:

cif = null
s = "Hello World"
args = []
values = []
args[0] = ffi.type_pointer
values[0] = address_of(s)
if(ffi.prepare(cif, ffi.DEFAULT_ABI, ffi.type_uint, args)):
     ffi.call(cif, "puts", values)
简而言之,我想让libffi动态查找ffi首先支持的函数,类似于dlfcn/LoadLibrary,然后使用提供的ffi-CIF类型调用它


这样的事情在Liffi身上可能发生吗?一个简单的例子会是什么样子?

有两种可能性——一种需要程序员有预谋

根据操作系统的不同,存在与共享库相关联的设施,用于从程序或其共享库中查找符号

在许多Unix系统和Linux上,特别是在中声明了协作室,它们是dlopen、dlsym和dlclose等。如果为共享库指定了适当的句柄,则可以使用:

int (*ffi_ptr)(const char *) = dlsym(ffi_handle, "ffi_function_name");
<>你必须考虑铸件——通常是残忍的——避免编译警告。< /P> 另一种有预谋的方法是构建一个函数名和函数指针表,在其中可以搜索名称并使用相应的指针:

struct ptr_function
{
    void (*func_ptr)(void);
    const char *func_name;
};

static const struct ptr_function[] =
{
    { func_1, "func_1"       },
    { func_2, "func_2"       },
    { func_2, "func_synonym" },
};

enum { NUM_PTR_FUNCTION = sizeof(ptr_function) / sizeof(*ptr_function) } ;
请注意,此技术允许以dlsym机制不允许的方式使用同义词。然而,预谋往往是一个主要障碍。这项技术可以追溯到80年代和90年代初,当时共享库并不普遍可用。同样,对强制转换的需要可能会使代码变得更复杂