我读到 struct 中位字段的顺序是特定于平台的.如果我使用不同的特定于编译器的打包选项,是否可以保证数据在写入时按正确的顺序存储?例如:

struct Message
{
  unsigned int version : 3;
  unsigned int type : 1;
  unsigned int id : 5;
  unsigned int data : 6;
} __attribute__ ((__packed__));

在装有GCC编译器的英特尔处理器上,字段按显示的方式布局在内存中.Message.version是缓冲区中的前3位,Message.type紧随其后.如果我为各种编译器找到等价的 struct 打包选项,这会是跨平台的吗?

推荐答案

不,它不会是完全便携的. struct 的打包选项是扩展,本身不是完全可移植的.除此之外,C99§6.7.2.1第10段说:"单元内位字段的分配顺序(高位到低位或低位到高位)是由实现定义的."

例如,即使是单个编译器,也可能根据目标平台的endianness不同地布局位字段.

C++相关问答推荐

你能用自己的地址声明一个C指针吗?

返回一个包含数组的 struct

为什么GCC可以调用未定义的函数?

C:fopen是如何实现二进制模式和文本模式的?

为什么可以在typedef之前使用typedef d struct 体?

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

将uintptr_t添加到指针是否对称?

整型文字后缀在左移中的用途

获取每个循环迭代结束时的当前时间

为什么此共享库没有预期的依赖项?

等同于铁 rust 的纯C语言S未实现!()宏

C代码在字符串中删除不区分大小写的子字符串的问题

如何摆脱-WIMPLICIT-Function-声明

C23标准是否向后兼容?

在下面的C程序中,.Ap0是如何解释的?

如何使用WRITE()以指针地址的十六进制形式写入标准输出

解密Chrome加密密钥

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

获取 struct 中匿名 struct 的大小

C 中类型说明符的顺序重要吗?