Я изменяю немного кода 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) не будет выровненный в начале объединения?
- редактирование: Спасибо за Ваши ответы. Ответ на этот вопрос на самом деле предоставил мне ответ, в котором я нуждался: указатель на объект объединения, соответственно преобразованный, указывает каждому из своих участников (или если участник является битовым полем, то к единице, в которой он находится), и наоборот..
Я должен просто выбрать один из ответов для этого вопроса как принятый ответ, так или иначе?
Вы исследовали __ attribute __
?
http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Type-Attributes.html
Может быть, вы могли бы убедиться, что вам нужно выровнять с помощью этого?
См. пакет прагмы в Visual Studio, если вы (также) используете этот компилятор.