在C中将函数指针转换为另一个函数指针是否安全?
将这 2 个函数转换为回调指针类型然后调用它们而不回转换是否安全?
typedef void (*callback)(int i, ...);
void foo() {
// something.
}
void foo2(int i, int j) {
// something.
}
int main(void)
{
callback c = (callback)&foo, c2 = (callback)&foo2;
(*c)(0); (*c2)(0,1);
return 0;
}
回答
强制转换本身是安全的,但在调用函数时必须使用正确的类型。这是 C 标准 6.3.2.3 所说的:
指向一种类型函数的指针可以转换为指向另一种类型函数的指针,然后再返回;结果应与原始指针相等。如果使用转换后的指针调用类型与引用类型不兼容的函数,则行为未定义。
在您的情况下void (*)(int i, ...),与其他任何一个函数都不兼容,因此此代码是非常未定义的行为。然而,一些编译器为非原型void foo()风格的泛型函数指针使用提供了非标准的扩展。但是那个反过来又是过时的 C 并且不应该因为这个原因使用 - 总是void foo (void)在 C 中使用并且永远不要空括号。