Как обеспечить порядок структуры бит с помощью компилятора GCC? - PullRequest
10 голосов
/ 18 июля 2011

Мне было интересно, есть ли директива компилятора C GCC, которая позволяет мне определять порядок битов для упаковки структуры? Что-то вроде:

#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 Compiler есть директива компилятора, которая выполняет замену порядка битов, прежде чем я попытаюсь перевернуть все поля в файле, предоставленном производителем.

1 Ответ

14 голосов
/ 18 июля 2011

Какую версию GCC вы используете и какую платформу?Существует прагма, которая может добиться цели, но она не работает на x86, начиная с GCC 4.

#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 ++: порядок и выравнивание поля принудительных битов

...