更改回调函数名称会导致 C 语言中的 ABI 中断?

Changing the callback function name causes ABI break in C?

提问人:Lunch Basketball 提问时间:8/18/2023 最后编辑:Some programmer dudeLunch Basketball 更新时间:8/18/2023 访问量:42

问:

我想检查这个问题。

这是应用程序库中的回调定义(例如 Plat从 1.0 版本开始)

typedef void (*module_change_callback)(int state);

后 我想把名字改得更清楚。(例如平台版本 2.0)

typedef void (*module_changed_callback)(int state);

它会导致一些 ABI 中断吗?

提前致谢

我认为这不是 ABI 中断,因为它不是类型签名的更改。只是,更改了类型名称。

C 回调 ABI

评论

0赞 Some programmer dude 8/18/2023
您显示的内容只是类型别名。它们只是编译时的东西,一旦编译器完成生成目标文件,它们就会丢失。

答:

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_callbackmodule_changed_callbackvoid (*)(int)

// no warning
module_change_callback x = (module_changed_callback) 0;