2013-05-21 4 views
1

Я хотел бы объединить структуру и массив байтов в объединении. Компилятор - gcc.Байт-массив, объединенный с struct (byte aligment)

Является следующим хорошим/сохраненным кодом для 32-битного встроенного контроллера (AVR)? Должен ли я беспокоиться о байте?

#include <stdint.h> 

typedef int8_t S8; 

typedef union { 
    struct { 
     S8 a; 
     S8 b; 
     S8 c; 
     S8 d; 
     S8 e; 
    }; 
    S8 array[5]; 
} s_t; 

Initialization:

s_t s = {.array = {0, 0, 0, 0, 0}}; 

доступа:

s.a = 50; 
s.c = 42; 
+1

Компилятор мог обрабатывать этот авто. Эндианность важна. –

+0

вы должны использовать тип данных 'stdint.h'' uint8_t' вместо 'char'. –

+0

@claptrap, спасибо. Я отредактировал вопрос. – sergej

ответ

3

Я думаю, что вы показываете это хорошо, но вы должны быть обеспокоены, если вы когда-либо использовать массив s_t, так как в конце может быть прокладка.

Вы можете указать GCC «упаковать» структуру с использованием расширения __attribute__ синтаксиса. Добавить __attribute__((packed)) перед окончательным ;.

+0

Я не думаю, что заполнение в конце структуры является проблемой, в реальной жизни (хотя стандарт C не гарантирует ее). Выравнивание структуры наследуется от ее членов, так как все они являются 8-битными объектами, ни одна из них не повысит выравнивание структуры. С другой стороны, структура * * упакована * - это то, что я полностью отвлек бы вас от использования! Это не часть стандарта C, и люди действительно не знают, какие последствия могут использовать ее. – Lindydancer

+0

Как я вижу, * упакованные * структуры/союзы - это только * способ убедиться, что структура или объединение выложены в памяти предсказуемым образом. В зависимости от целевой архитектуры компилятор может, например, выбрать одну 1-байтовую переменную * для своего 4-байтового слова в памяти, которая просто молча разбивает доступ к этим переменным. – JimmyB

Смежные вопросы