c - 将函数指针强制转换为 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;
}
解决方案
强制转换本身是安全的,但调用函数时必须使用正确的类型。这就是 C 标准 6.3.2.3 所说的:
指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,然后再返回;结果应与原始指针比较。如果转换后的指针用于调用类型与引用类型不兼容的函数,则行为未定义。
在您的情况下void (*)(int i, ...)
,与其他任何一个功能都不兼容,因此此代码是完全未定义的行为。但是,一些编译器为使用非原型void foo()
样式的泛型函数指针提供了非标准扩展。但是那个反过来又是过时的 C 并且不应该因为这个原因而使用 - 总是void foo (void)
在 C 中使用并且永远不要使用空括号。
推荐阅读
- ansible - 无法在ansible中读取http状态码
- eslint - eslint 可以在 tslint 上使用相同的规则吗?
- sql - PostgreSQL 用户定义类型枚举与外键 - 维护和性能
- angular - 如何在 Nativescript 中重新启动按需加载?
- javascript - Node 和 PDFKit - 如何将 PDF 生成业务逻辑与路由器分离
- python - Tensorflow ValueError:无法将字符串转换为浮点数:'MXHbacc3'
- c - 如何在线性化 64x64 数组中找到重叠
- algorithm - 算法:在哪里放置设施,挖井,总距离最小
- laravel-5 - 如何在视图刀片中显示雄辩的查询?
- javascript - 向折线图添加填充 - 任何图表中的数据以正确显示线条