我想检查一下这个问题。
这是应用程序库中的回调定义(例如Platfrom 1.0版本)
typedef void (*module_change_callback)(int state);
后来, 我想更改名称以使其更清晰。 (例如平台版本 2.0)
typedef void (*module_changed_callback)(int state);
它会导致一些 ABI 中断吗?
提前致谢
我认为这不是 ABI 破坏,因为它不是类型签名的更改。只是,更改类型名称。
只有 C 编译器翻译了源代码后,ABI 才在生成的汇编程序中起作用。在此过程中,C 标识符将被丢弃,因此如果您只是更改类型等的名称,它仍然会生成相同的代码。现代 C 并不真正允许您编写不匹配的函数声明和定义 - 只有旧的 C90 才会导致问题。
当您执行诸如函数指针类型转换/双关之类的有问题的操作时,或者从 C 调用汇编程序中定义的函数时,您通常只需要担心 ABI/调用约定错误,反之亦然。
(特别是在托管系统和 Windows 环境中,在使用 DLL 等可移植库时,您可能还需要担心调用约定。)
不,ABI 没有被破坏。
module_change_callback
和module_changed_callback
都是void (*)(int)
类型的别名。这些别名指的是完全相同的类型,并且可以自由互换。
// no warning
module_change_callback x = (module_changed_callback) 0;