我使用函数指针的结构来实现不同后端的接口。签名非常不同,但返回值几乎都是 void、void * 或 int。
struct my_interface {
void (*func_a)(int i);
void *(*func_b)(const char *bla);
...
int (*func_z)(char foo);
};
但并不要求后端支持每个接口函数的函数。所以我有两种可能性,第一种选择是在每次调用之前检查指针是否不等于 NULL。我不太喜欢这样,因为它的可读性和我担心性能影响(但是我没有测量它)。另一种选择是有一个虚拟函数,在极少数情况下接口函数不存在。
因此,每个签名都需要一个虚拟函数,我想知道是否有可能只有一个用于不同的返回值。并将其转换为给定的签名。
#include <stdio.h>
int nothing(void) {return 0;}
typedef int (*cb_t)(int);
int main(void)
{
cb_t func;
int i;
func = (cb_t) nothing;
i = func(1);
printf("%d\n", i);
return 0;
}
我用 gcc 测试了这段代码,它可以工作。但它是理智的吗?或者它会破坏堆栈还是会导致其他问题?
编辑:感谢所有答案,经过进一步阅读,我现在学到了很多关于调用约定的知识。现在对幕后发生的事情有了更好的了解。