2011-01-12 1 views
2

SDL_Event является объединением 8-битного типа без знака и многими структурами, чей первый элемент представляет собой неподписанный 8-битный тип. Рекомендуемое использование - это доступ к элементу Uint8 союза для определения типа события, а затем доступа к объединению элементом, соответствующим этому типу.Является объединением структур, разделяющих неопределенное поведение первого элемента?

Это, очевидно, зависит от всех типов в союзе, имеющих одинаковое пространство, зарезервированное для идентификатора типа. Можем ли мы быть уверенными, что это так, или это неопределенное поведение?

Редактировать: сделал заголовок более наглядным.

+0

Что такое «идентификатор типа», о котором вы говорите? 'Uint8_t' или что-то еще? C не сохраняют свой тип. –

+0

@R .. Да, Uint8, который, я считаю, typedef'd для uint8_t. –

ответ

5

Первый элемент структуры гарантированно находится в «смещении 0» от начала структуры. Так что это должно быть безопасно.

4

Я нашел его в стандарте C99.

6.5.2.3.5:

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

Таким образом, похоже, что реализация SDL близка к чему-то гарантированному правильному. Если бы он использовал структуру, содержащую только Uint8, тогда она была бы гарантирована, но я думаю, что обнаженный Uint8 - это неопределенное поведение, которое, скорее всего, будет работать так, как ожидалось.

+0

Вы правы. Возможно, я видел это в другой версии стандарта или просто представлял себе это :) – Jester

Смежные вопросы