首页 > 解决方案 > 将函数指针强制转换为 C 中的另一个函数指针是否安全?

问题描述

将这两个函数转换为回调指针类型然后在不回退的情况下调用它们是否安全?

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;
}

标签: cpointers

解决方案


强制转换本身是安全的,但调用函数时必须使用正确的类型。这就是 C 标准 6.3.2.3 所说的:

指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,然后再返回;结果应与原始指针比较。如果转换后的指针用于调用类型与引用类型不兼容的函数,则行为未定义。

在您的情况下void (*)(int i, ...),与其他任何一个功能都不兼容,因此此代码是完全未定义的行为。但是,一些编译器为使用非原型void foo()样式的泛型函数指针提供了非标准扩展。但是那个反过来又是过时的 C 并且不应该因为这个原因而使用 - 总是void foo (void)在 C 中使用并且永远不要使用空括号。


推荐阅读