【问题标题】:How to enforce the struct bit order with the GCC compiler?如何使用 GCC 编译器强制执行 struct 位顺序?
【发布时间】:2011-07-18 02:41:25
【问题描述】:

我想知道是否有 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 编译器中有一个编译器指令可以在我尝试翻转制造商提供的文件中的所有字段之前为我进行位顺序交换。

【问题讨论】:

标签: c gcc compiler-construction microcontroller bit-fields


【解决方案1】:

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

#pragma reverse_bitfields on

更多详情请访问:

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++: Force Bit Field Order and Alignment

【讨论】:

  • 非常感谢伙计!那真的很翔实!他们取消 GCC 的分支是 4.3.0 版。我为该目标 MCU 拥有的 GCC C 编译器的文档非常少,我正在努力充分利用它。看起来唯一的出路是自己重新排序结构。再次感谢您帮助我加快找到可行解决方案的过程:)
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多