将f(mystruct*a)更改为f(const mystruct*a)是否会破坏C中的API/ABI?

Dim*_*ima 7 c api compatibility const abi

1: void f(mystruct *a)
2: void f(const mystruct *a)
Run Code Online (Sandbox Code Playgroud)

更改1-> 2的函数签名是否会破坏C中的API/ABI?
如何改变2-> 1?

Mic*_*urr 5

从C99标准6.2.5/26"类型":

指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求.

所以ABI/API不应该从1到2受到影响.(API不会改变,因为指向非const限定类型的指针可能会转换为指向该类型的const限定版本的指针 - 6.3 .2.3/2"转换 - 指针").

但是,如果从2变为1,则API会更改,因为指向const对象的指针不能隐式转换为指向非const对象的指针.以下代码将在版本2下编译,但不会在版本1下编译:

static const mystruct foo;

f(&foo);
Run Code Online (Sandbox Code Playgroud)


yan*_*yan 2

就ABI而言,不会,只会const影响编译阶段的错误。编译后的目标文件不应有 const 说明符的残留。