如何使用GCC编译器强制执行struct bit顺序?

Ver*_*ern 11 c compiler-construction microcontroller gcc bit-fields

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

#pragma bit_order left
Run Code Online (Sandbox Code Playgroud)

这种需求的基本原理是我有以下结构:

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;
Run Code Online (Sandbox Code Playgroud)

有了这个结构,我希望编译器以这种方式打包它:

Bit order: | 7  6  5  4  3  2  1  0 |
Label:     |B0 B1 B2 B3 B4 B5 B6 B7 |
Run Code Online (Sandbox Code Playgroud)

而不是GCC如何做到:

Bit order: | 7  6  5  4  3  2  1  0 |
Label:     |B7 B6 B5 B4 B3 B2 B1 B0 |
Run Code Online (Sandbox Code Playgroud)

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

kic*_*hik 15

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

#pragma reverse_bitfields on
Run Code Online (Sandbox Code Playgroud)

更多详情:

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

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

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

关于位域坏的一些细节:

C/C++:强制位域顺序和对齐

  • 谢谢很多伙伴!那确实很有用!他们关闭GCC的分支是版本4.3.0.我为该目标MCU提供的GCC C编译器的文档非常稀疏,我正在努力充分利用它.看起来唯一的出路就是自己重新排序结构.再次感谢您帮助我加快实现可行解决方案的过程:) (2认同)