13

構造体のパッキングのビット順序を決定できる 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 コンパイラにビット オーダー スワップを行うコンパイラ ディレクティブがあることを願っています。

4

1 に答える 1

17

使用している GCC のバージョンとプラットフォームは? このトリックを実行できるプラグマが存在しますが、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++: ビット フィールドの順序と配置を強制する

于 2011-07-18T03:05:29.400 に答える