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

问题描述 投票:0回答:2

我想检查一下这个问题。

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

typedef void (*module_change_callback)(int state);

后来, 我想更改名称以使其更清晰。 (例如平台版本 2.0)

typedef void (*module_changed_callback)(int state);

它会导致一些 ABI 中断吗?

提前致谢

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

c callback abi
2个回答
0
投票

只有 C 编译器翻译了源代码后,ABI 才在生成的汇编程序中起作用。在此过程中,C 标识符将被丢弃,因此如果您只是更改类型等的名称,它仍然会生成相同的代码。现代 C 并不真正允许您编写不匹配的函数声明和定义 - 只有旧的 C90 才会导致问题。

当您执行诸如函数指针类型转换/双关之类的有问题的操作时,或者从 C 调用汇编程序中定义的函数时,您通常只需要担心 ABI/调用约定错误,反之亦然。

(特别是在托管系统和 Windows 环境中,在使用 DLL 等可移植库时,您可能还需要担心调用约定。)


0
投票

不,ABI 没有被破坏。

module_change_callback
module_changed_callback
都是
void (*)(int)
类型的别名。这些别名指的是完全相同的类型,并且可以自由互换。

// no warning
module_change_callback x = (module_changed_callback) 0;
© www.soinside.com 2019 - 2024. All rights reserved.