这是一个通用函数指针吗
不,如果我没有弄错的话,C 中不存在“通用函数指针”这样的东西。
这危险吗?
是的。这是邪恶的。
您需要了解一些事情。首先,除非你运行的是符合 POSIX 的系统,
void(*test)() = (void*)add;
is wrong. void *
是一个指针object类型,因此它与函数指针不兼容。 (至少在标准 C 中不是这样——正如我提到的,POSIX 也要求它与函数指针兼容。)
第二件事是void (*fp)()
and void (*fp)(void)
是不同的。以前的声明允许fp
接受任意数量、任意类型的参数,当编译器看到第一次调用函数(指针)时,将推断出参数的数量及其类型。
另一个重要的方面是保证函数指针可以相互转换(据我所知,这表明它们具有相同的表示和对齐要求)。这意味着任何函数指针都可以分配给任何函数(在适当的强制转换之后)(的地址),只要您不这样做call通过指向不兼容类型的指针的函数。当且仅当在调用指针之前将指针强制转换回原始类型时,该行为才是明确定义的。
所以,如果你想要一个“通用”函数指针,你可以写类似的东西
typedef void (*fn_ptr)(void);
然后你可以将任何指向函数的指针分配给类型的对象fn_ptr
。同样需要注意的是,调用函数时要转换为正确的类型,如下所示:
int add(int a, int b);
fn_ptr fp = (fn_ptr)add; // legal
fp(); // WRONG!
int x = ((int (*)(int, int))fp)(1, 2); // good