членское выравнивание в c встроенное в структуру объединение

Я изменяю немного кода C, который идет примерно как это:

typedef struct  STRUCT_FOO {
  ULONG FooInfo;     
  union {               
    ULONG  LongData;
    USHORT ShortData;
    UCHAR  CharData;
  };
} FOO;

...

FOO foo;
ULONG dataLength = offsetof(FOO, CharData) + sizeof(foo.CharData);

Очевидно, код пытается выяснить число интересных байтов в структуре при использовании члена CharData объединения. Моя проблема, что компилятор предупреждает об объединении, являющемся без имени. Таким образом, я изменяю его в

typedef struct  STRUCT_FOO {
  ULONG FooInfo;     
  union {               
    ULONG  LongData;
    USHORT ShortData;
    UCHAR  CharData;
  } FooData;
} FOO;

Но затем конечно, я также должен изменить последнюю строку. Следующее будет всегда приводить точно к тем же результатам как оригинал?

ULONG dataLength = offsetof(FOO, FooData) + sizeof(foo.FooData.CharData);

или действительно ли это возможно, что CharData (или ShortData или LongData) не будет выровненный в начале объединения?

- редактирование: Спасибо за Ваши ответы. Ответ на этот вопрос на самом деле предоставил мне ответ, в котором я нуждался: указатель на объект объединения, соответственно преобразованный, указывает каждому из своих участников (или если участник является битовым полем, то к единице, в которой он находится), и наоборот..

Я должен просто выбрать один из ответов для этого вопроса как принятый ответ, так или иначе?

1
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

Вы исследовали __ attribute __ ?

http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Type-Attributes.html

Может быть, вы могли бы убедиться, что вам нужно выровнять с помощью этого?

1
ответ дан 2 September 2019 в 23:32
поделиться

См. пакет прагмы в Visual Studio, если вы (также) используете этот компилятор.

1
ответ дан 2 September 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: