Является ли объединение структур, разделяющих первый элемент, неопределенным поведением? - PullRequest
2 голосов
/ 12 января 2011

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

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

Правка: сделал заголовок более информативным.

Ответы [ 2 ]

5 голосов
/ 12 января 2011

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

4 голосов
/ 12 января 2011

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

6.5.2.3.5:

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

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

...