выравнивание членов в c-структурном объединении - PullRequest
1 голос
/ 24 июня 2010

Я модифицирую немного кода на 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) не будут выровнены в начале объединения?

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

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

Ответы [ 2 ]

1 голос
/ 24 июня 2010

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

1 голос
/ 24 июня 2010

Вы исследовали __attribute__?

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...