我有一个名为“bench”的函数,它接受一个返回 void 指针的函数指针(对于泛型)。
static inline unsigned long bench(void* (*funcPtr)(va_list), ...)
但是如果我向它传递一个返回其他任何内容的函数,我会收到此错误 -
passing argument 1 of 'bench' from incompatible pointer type
所以它完全拒绝类型转换。但是,如果我在调用基准函数时手动将其转换为 void 指针,则会收到此错误 -
ISO C forbids passing argument 1 of 'bench' between function pointer and 'void *'
我知道的一个解决方法是使用返回 void 指针的包装函数,但随后我必须为我需要传递的每个单独函数创建一个新的包装函数,这将非常低效,反之亦然就是为我将使用的每种数据类型创建一个包装函数,这并不是那么低效,但确实如此。有更好的解决办法吗?
C 没有通用的函数指针类型,就像
void *
用于对象一样。但是,您可以将任何函数指针转换为任何其他函数指针类型。因此,要将函数 foo
传递给 bench
,可以将其转换为 bench
的参数类型:
bench((void *) (*)(va_list)) foo);
虽然这可以转换和传递指针,但调用函数依赖于通过正确的类型调用它(根据函数调用规则匹配其声明的东西)。