Что касается псевдонимов:
Общая начальная последовательность касается только псевдонимов двух структурных типов.Здесь это не проблема, и ваши две структуры являются даже совместимыми типами, и поэтому указатели на них могут быть псевдонимами без использования каких-либо уловок.Рассечение C11 6.2.7:
6.2.7 Совместимый тип и составной тип
Два типа имеют совместимый тип, если их типы совпадают./ - / Кроме того, два типа структуры, объединения или перечисления, объявленные в отдельных единицах перевода, совместимы, если их теги и члены удовлетворяют следующим требованиям:
Если один объявлен с тегом, другой должен быть объявленс тем же тегом.
Ни одна структура не объявлена здесь с тегом.
Если оба выполняются где-либо в пределах их соответствующих единиц перевода, то применяются следующие дополнительные требования:
Они оба завершены (определены).
между их членами должно быть взаимно-однозначное соответствие, так что каждая пара соответствующих членов объявляется с совместимыми типами;
Это справедливо для этих структур.
, если один член пары объявлен с помощью спецификатора выравнивания, другой объявлен с эквивалентным спецификатором выравнивания;и если один член пары объявлен с именем, другой объявлен с тем же именем.
Спецификаторы выравнивания не применяются.
Для двух структур соответствующие члены должны быть объявлены в одном и том же порядке.
Это верно.
Вывод: обе ваши структуры имеют совместимые типы.Это означает, что вам не нужны никакие уловки, такие как обычная начальная последовательность.Правило строгого псевдонима просто гласит (6.5 / 7):
Объект должен иметь свое сохраненное значение, доступное только через выражение lvalue, которое имеет один из следующих типов:
- тип, совместимый сэффективный тип объекта,
Это здесь случай.
Кроме того, как уже упоминалось в других ответах, эффективный тип фактических данных здесь равен int
, так каквыделенное хранилище не дает эффективного типа и поэтому становится первым типом, используемым для доступа к lvalue.Это также означает, что компилятор не может предположить, что указатели не будут псевдонимами.
Кроме того, правило строгого псевдонима дает исключение для lvalue-доступа членов структур и объединений:
агрегированный или объединенный тип, который включает в себя один из вышеупомянутых типов среди своих членов
И тогда у вас есть общая начальная последовательность поверх этого.Что касается псевдонимов, то это настолько четко определено, насколько это возможно.
Относительно типа наказания:
Ваша фактическая проблема, кажется, не имеет псевдонимов, но типа пробивая через союзы.Это смутно гарантировано C11 6.5.2.3/3:
Постфиксное выражение с последующим.оператор и идентификатор обозначают член структуры или объединенного объекта.Значение соответствует названному элементу (95) и является lvalue, если первое выражение является lvalue.
Это нормативный текст, и он плохо написан - никто не может понять, как предполагаются программы / компиляторывести себя исходя из этого.Информативное примечание 95) хорошо объясняет это:
95) Если элемент, используемый для чтения содержимого объекта объединения, не совпадает с элементом, который последний раз использовался для хранения значения в объекте,соответствующая часть представления объекта значения переосмысливается как представление объекта в новом типе, как описано в 6.2.6 (процесс, иногда называемый «наказанием типа»).Это может быть представление ловушки.
Это означает, что в вашем случае вы запускаете преобразование типов из одного типа структуры в другой совместимый тип структуры.Это совершенно безопасно, поскольку они одного типа и проблемы с выравниванием или ловушками не применяются.
Обратите внимание, что здесь C ++ отличается.