gpt4 book ai didi

c - 在不知道其原型(prototype)的情况下在运行时动态调用 C 函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:57 24 4
gpt4 key购买 nike

我想知道是否有可能实现上述目标。显然,可以在 Linux 中使用 dlopen、dlsym 方法加载库并调用它的方法。但是它需要知道函数原型(prototype)才能在调用之前将 void * 指针转换为相应的类型。

假设可以从外部提供原型(prototype)元数据(使用一些描述 rune 件等)

有没有办法做到这一点?

最佳答案

这当然是可能的,但不要指望任何便携的东西。例如,您可以使用臭名昭著的 libffi图书馆。伪 C 中的虚拟示例:

// We make some kind of descriptor structure and possible return and argument types
enum c_type {
C_TYPE_CHAR,
C_TYPE_INT,
C_TYPE_FLOAT,
C_TYPE_PTR,
C_TYPE_VOID
};

struct func_proto_desc {
enum c_type ret_type;
int n_args; // Reasonable convention: -1 for variadic
c_type *arg_types;
};

// Imaginary function that parses textual metadata and returns a function descriptor
void parse_func_desc(const char *str, struct func_proto_desc *desc);

// this is how to use it:
struct func_proto_desc fproto;
parse_func_desc("void (*)(int, float, const char *)", &fproto);

ffi_cif cif;
ffi_type *args[3];
void *vals[3];

int n = 42;
float f = 3.1415927;
const char *s = "Hello world!";

vals[0] = &n;
vals[1] = &f;
vals[2] = &s;

// Here you can set up the types according to the type description
// that the parser function returned
// (this one is an imaginary function too)
populate_ffi_types_from_desc(args, &fproto);

// Use libffi to call the function
ffi_prep_cif(&cif, FFI_DEFAULT_ABI, fproto->n_args, &ffi_type_void, args);
ffi_call(&cif, func_ptr, NULL, vals);

像这样的事情应该让你开始。

关于c - 在不知道其原型(prototype)的情况下在运行时动态调用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16253307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com