在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 中使用并且永远不要空括号。


以上是在C中将函数指针转换为另一个函数指针是否安全?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>