c - 如何使用 GCC 编译器强制执行结构位顺序?

标签 c gcc compiler-construction microcontroller bit-fields

我想知道是否有 GCC C 编译器指令允许我确定结构打包的位顺序?类似的东西:

#pragma bit_order left

这种需求的理由是我有以下结构:

struct {
       union {
             unsigned char BYTE;
             struct {
                 unsigned char B0: 1;
                 unsigned char B1: 1;
                 unsigned char B2: 1;
                 unsigned char B3: 1;
                 unsigned char B4: 4;
             }BIT;
       }ITEM;
} myStruct;

有了这个结构,我希望编译器这样打包:

Bit order: | 7  6  5  4  3  2  1  0 |
Label:     |B0 B1 B2 B3 B4 B5 B6 B7 |

而不是 GCC 是如何做到的:

Bit order: | 7  6  5  4  3  2  1  0 |
Label:     |B7 B6 B5 B4 B3 B2 B1 B0 |

我正在处理具有巨大头文件的 MCU,这些头文件具有根据规定的硬件地址计算位偏移的结构。我希望在我尝试翻转制造商提供的文件中的所有字段之前,GCC C 编译器中有一个编译器指令可以为我交换位顺序。

最佳答案

您使用哪个版本的 GCC 以及哪个平台?存在一个 pragma 可以解决这个问题,但它在从 GCC 4 开始的 x86 上不起作用。

#pragma reverse_bitfields on

更多详情:

http://groups.google.com/group/gnu.gcc.help/browse_thread/thread/747918655affa5c0?pli=1

如果您不介意重建 GCC,所有相关的build设置都在这里(搜索 bitfield):

http://gcc.gnu.org/onlinedocs/gccint/Storage-Layout.html

有关位域错误的一些细节:

C/C++: Force Bit Field Order and Alignment

关于c - 如何使用 GCC 编译器强制执行结构位顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728218/

相关文章:

c - 在c中显示递归结构

c++ - 使用 iptables 共享来自两个不同连接的 Internet 连接

c++ - extern 模板不适用于 gcc?

c# - 错误CS1647 : An expression is too long or complex to compile [duplicate]

c++ - 编译代码时无法访问对象

c - 将数字添加到链接列表时出错

c++ - 为什么我的模板需要 C++ 链接?

c++ - 这是合法的 C++ 代码吗?

c - 忽略文件 lib.a,文件是为存档构建的,不是被链接的体系结构 (x86_64)

c++ - 关于一个编译器同时执行多个任务