Mar*_*ler 11 c linker enums portability struct
我正在使用提供给我的C库.我在编译库时使用的编译器,版本,选项等信息有限.库接口enum在传递的结构中使用它们,并且直接作为传递的参数使用.
问题是:当我编译代码以使用提供的库时,我如何保证或确定我的编译器将使用与enums 相同的大小?如果没有,则结构将不会排列,并且参数传递可能会混乱,例如long对int.
我的担忧源于C99标准,该标准规定了以下enum类型:
应与char,有符号整数类型或无符号整数类型兼容.类型的选择是实现定义的,但应能够表示枚举的所有成员的值.
据我所知,只要最大值适合,编译器就可以选择任何类型,它非常有用,有效地随心所欲,不仅可能在编译器之间变化,而且可能在同一编译器和/或编译器选项的不同版本之间变化.它可以选择1,2,4或8字节表示,从而导致结构和参数传递中的潜在不兼容性.(它也可以选择签名或未签名,但我没有看到在这种情况下出现问题的机制.)
我在这里错过了什么吗?如果我没有遗漏某些东西,这是否意味着enum永远不应该在API中使用?
更新:
是的,我错过了什么.虽然语言规范在这里没有帮助,但正如@Barmar所指出的应用程序二进制接口(ABI)所做的那样.或者如果没有,则ABI不足.我的系统的ABI确实指定enum必须是带符号的四字节整数.如果编译器不服从,那就是一个bug.给定完整的ABI和兼容编译器,enum 可以在API中安全使用.
使用枚举的API取决于编译器将保持一致的假设,即,给定相同的枚举声明,它将始终选择相同的基础类型.
虽然语言标准并不特别要求这样做,但编译器做其他任何事情都是相当不正常的.
此外,特定操作系统的所有编译器都需要与操作系统的ABI保持一致.否则,您将遇到更多问题,例如使用64位的库,int而调用者使用32位int.理想情况下,ABI应该约束enums 的表示,以确保兼容性.
更一般地,语言规范仅确保使用相同实现编译的程序之间的兼容性.ABI确保使用不同实现编译的程序之间的兼容性.
| 归档时间: |
|
| 查看次数: |
1705 次 |
| 最近记录: |