提问人:Lunch Basketball 提问时间:8/18/2023 最后编辑:Some programmer dudeLunch Basketball 更新时间:8/18/2023 访问量:42
更改回调函数名称会导致 C 语言中的 ABI 中断?
Changing the callback function name causes ABI break in C?
问:
我想检查这个问题。
这是应用程序库中的回调定义(例如 Plat从 1.0 版本开始)
typedef void (*module_change_callback)(int state);
后 我想把名字改得更清楚。(例如平台版本 2.0)
typedef void (*module_changed_callback)(int state);
它会导致一些 ABI 中断吗?
提前致谢
我认为这不是 ABI 中断,因为它不是类型签名的更改。只是,更改了类型名称。
答:
1赞
Lundin
8/18/2023
#1
ABI 仅在 C 编译器转换源代码后才在生成的汇编程序中起作用。在此过程中,C 标识符将被丢弃,因此如果您只是更改了类型等的名称,它仍然会生成相同的代码。现代 C 语言也不允许你编写不匹配的函数声明和定义——只有旧的 C90 才会导致问题。
通常,当您执行函数指针类型转换/双关等有问题的事情时,或者从 C 调用汇编程序中定义的函数时,或者从 C 调用汇编程序中定义的函数时,通常只需要担心 ABI/调用约定事故,反之亦然。
(在托管系统和 Windows 的上下文中,在使用 DLL 等可移植库时,您可能还需要担心调用约定。
1赞
tstanisl
8/18/2023
#2
不,ABI 没有损坏。
和 都是类型的别名。这些别名指的是完全相同的类型,它们可以自由互换。module_change_callback
module_changed_callback
void (*)(int)
// no warning
module_change_callback x = (module_changed_callback) 0;
评论