Страницы

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

пятница, 10 января 2020 г.

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

#c #синтаксис


Подсмотрела у коллег в проекте примерно вот такую конструкцию:  

struct A {
  int i;
  union {
    char j;
    double k;
  };
} a;
...
a.j = 'a';


Проект на С, компилируется под gcc.
Нашла описание подобного использования union для плюсов, но вот для С такого (использование
объединения без имени с упрощенным доступом к его полям) мне раньше не попадалось.

Это допустимая для С конструкция, или это одна из особенностей gcc? При переходе
на другой компиллятор с ней проблем не возникнет?
    


Ответы

Ответ 1



Это вполне совместимая со стандартом 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.

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

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