gpt4 book ai didi

c - 是否可以创建一个通用函数指针数组?

转载 作者:行者123 更新时间:2023-12-03 03:39:11 25 4
gpt4 key购买 nike

我正在为我们通过 dlopen/dlsym 打开的共享库编写一个接口(interface)层。函数的参数可能会发生变化,具体取决于库是针对系统 A 还是系统 B 编译的。

我有一个想法,我可以尝试创建一个包含从 dlsym 返回的所有函数指针的数组,然后最终使用 VA_ARGS 传递数据,而不是执行一堆 typedef。这也让我能够处理可扩展性——如果库参数发生变化,我们只需要更新调用函数,而不是下面的 typedef。基本上,我希望改变这样的事情:

typedef int* (*foo_t)(int, int);
typedef int* (*bar_t)(int, int, char*, int);
typedef void (*baz_t)(void);

void GetStuff()
{
void *handle = dlopen("/my/cool/libLibrary.so", RTLD_LAZY);
foo_t foo = dlsym(handle, "TheFooFunction");
bar_t bar = dlsym(handle, "TheBarFunction");
baz_t baz = dlsym(handle, "TheBazFunction");

foo(1, 2);
bar(3, 4, "cool", 5);
baz();
}

进入此:

enum funcs
{
FUNC_FOO = 0,
FUNC_BAR = 1,
FUNC_BAZ = 2,
FUNC_MAX
};

void funcArray[FUNC_MAX]; // Not legal - looking for a way to do something like this...

char *functionNames[FUNC_MAX] =
{
[FUNC_FOO] = "TheFooFunction",
[FUNC_BAR] = "TheBarFunction",
[FUNC_BAZ] = "TheBazFunction"
};

void GetStuff()
{
void *handle = dlopen("/my/cool/libLibrary.so", RTLD_LAZY);
for (int i = 0; i < FUNC_MAX; i++)
{
funcArray[i] = dlsym(handle, functionNames[i]);
}

funcArray[FUNC_FOO](1, 2);
funcArray[FUNC_BAR](3, 4, "cool", 5);
funcArray[FUNC_BAZ]();
}

这可能吗?我知道 void 数组是非法的。我不能在它的位置使用 uintptr_t ,因为它们用于数据(而不是函数)指针。除了为每个配置创建大的 #define 并以原始方式执行之外,还有其他选择吗?

最佳答案

将数组声明为函数指针数组。实际上函数指针的类型并不重要。

void (*funcArray[FUNC_MAX])();

然后在调用之前,您必须将函数指针转换为正确的类型:

((int *(*)(int, int))funcArray[FUNC_FOO])(1, 2);
((int *(*)(int, int, char*, int))funcArray[FUNC_BAR])(3, 4, "cool", 5);
((void (*)(void))funcArray[FUNC_BAZ])();

关于c - 是否可以创建一个通用函数指针数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60402188/

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