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