Intereting Posts
Как мы можем применить функцию non-vararg над va_list? удалить все вхождения символа в строке C – Пример необходимо malloc () – Использует ли он brk () или mmap () Существует ли простая в использовании математическая библиотека векторных / матричных / кватернионов в чистом C? Что означают подавленные утечки в Вальгринде? Сохранить значение указателя Выделить память для структуры с указателем на символ в C 2D-манипуляция с использованием указателя в C C вопрос вывода Какой предопределенный макрос можно использовать для обнаружения clang? Перезаписывание файлов в Windows путем переименования случайным образом не выполняется Где хранятся статические переменные (сегмент данных или куча или BSS)? Как работают позиционные аргументы типа «1 $» с printf ()? Почему * p ++ отличается от * p + = 1? Как скомпилировать C-программу в gcc, которая имеет файлы заголовков?

Общая начальная последовательность в структурах, вложенных в определение union в стандарте C

В стандарте C11 существует следующее определение общей исходной последовательности, разделяемой структурами, вложенными в один союз:

6.5.2.3/6

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

ПРИМЕР 3 Ниже приведен допустимый fragment:

union { struct { int alltypes; } n; struct { int type; int intnode; } ni; struct { int type; double doublenode; } nf; } u; u.nf.type = 1; u.nf.doublenode = 3.14; /* ... */ if (unalltypes == 1) if (sin(u.nf.doublenode) == 0.0) /* ... */ 

Согласно моему пониманию этой статьи, приведенный выше код недействителен.

В внешнем операторе if мы указываем, что n::alltypes данных n::alltypes активен (одновременно с ni::type и nf::type как стандартные состояния), но во внутреннем, if мы используем nf::doublenode который не является частью общая начальная последовательность.

Может кто-нибудь прояснить эту проблему?

разрешено проверять общую начальную часть [нескольких структур, которые имеют общую начальную последовательность]

Используя предоставленный пример, эта часть спецификации говорит о том, что, поскольку каждый возможный тип члена union имеет int как начальное поле, вы можете получить доступ к этому обычному начальному полю, используя любой из типов членов, даже после того, как переменная была инициализирована / используется как один из конкретных типов членов.

Это как раз то, что делает этот пример: он обращается к начальному int как члену типов alltypes из n , после инициализации следующих полей как nf , а затем переходит к получению doublenode поля nf , используя одну и ту же переменную.

Использование union как одного из возможных типов не приводит к тому, что он работает в какой-то структуре: так работают профсоюзы.

Обратите внимание, что эта гарантия существует в течение некоторого времени: по существу один и тот же текст находится в спецификации ANSI , раздел: 3.3.2.3. Структура и члены объединения .