Спецификация языка содержит следующую гарантию
6.5.2.3 Структура и члены профсоюза
6 Одна специальная гарантия предоставляется для упрощения использования союзов: если профсоюз содержит
несколько структур, которые имеют общую начальную последовательность (см. ниже), и если объединение
В настоящее время объект содержит одну из этих структур, разрешается проверять общие
Начальная часть любого из них где угодно, что объявление о завершенном типе объединения
виден Две структуры имеют общую начальную последовательность, если соответствующие члены
иметь совместимые типы (и, для битовых полей, одинаковой ширины) для последовательности из одного или нескольких
первоначальные члены.
Это относится только к типовому наказанию через профсоюзы. Однако это, по сути, гарантирует, что начальные части этих структурных типов будут иметь одинаковую структуру памяти, включая заполнение.
Вышеприведенное не обязательно позволяет делать то же самое, приводя несвязанные типы указателей. Это может привести к нарушению правил наложения имен
6,5 выражений
7 Объект должен иметь свое сохраненное значение, доступное только через выражение lvalue, которое имеет одно из следующих значений:
следующие типы:
- тип, совместимый с эффективным типом объекта,
- квалифицированная версия типа, совместимого с эффективным типом объекта,
- тип, который является типом со знаком или без знака, соответствующим действующему типу
объект
- тип, который является типом со знаком или без знака, соответствующим квалифицированной версии
эффективный тип объекта,
- агрегатный или объединенный тип, который включает в себя один из вышеупомянутых типов среди своих
члены (включая, рекурсивно, член субагрегата или автономного объединения), или
- тип символа.
Единственный вопрос здесь - доступ к
((Struct1 *) struct2_ptr)->a_short
представляет собой доступ ко всему объекту Struct2
(в этом случае это нарушение 6.5 / 7 и оно не определено) или просто доступ к объекту short
(в этом случае он может быть точно определен).
Как правило, было бы неплохо придерживаться следующего правила: наказание типов допускается через объединения, но не через указатели. Не делайте этого с помощью указателей, даже если вы имеете дело с двумя struct
типами с общей начальной подпоследовательностью членов.