Страницы

Поиск по вопросам

среда, 27 февраля 2019 г.

неименованное объединение в структуре

Подсмотрела у коллег в проекте примерно вот такую конструкцию:
struct A { int i; union { char j; double k; }; } a; ... a.j = 'a';
Проект на С, компилируется под gcc. Нашла описание подобного использования union для плюсов, но вот для С такого (использование объединения без имени с упрощенным доступом к его полям) мне раньше не попадалось.
Это допустимая для С конструкция, или это одна из особенностей gcc? При переходе на другой компиллятор с ней проблем не возникнет?


Ответ

Это вполне совместимая со стандартом C, начиная с C11, конструкция. MSVC, который достаточно слабо поддерживает стандарт C, её тем не менее прекрасно понимает.
В стандарте C99 этой конструкции не было, но gcc тем не менее поддерживал её как расширение языка.
Википедия
The standard includes several changes to the C99 language and library specifications, such as: Anonymous structures and unions, useful when unions and structures are nested, e.g. in struct T { int tag; union { float x; int n; }; };
Ссылка на стандарт, §6.7.2.1/13:
An unnamed member whose type specifier is a structure specifier with no tag is called an anonymous structure; an unnamed member whose type specifier is a union specifier with no tag is called an anonymous union. The members of an anonymous structure or union are considered to be members of the containing structure or union. This applies recursively if the containing structure or union is also anonymous.

Комментариев нет:

Отправить комментарий