Spec-Zone.ru › GCC 15

6.2.6 Безымянные поля структур и объединений

В соответствии с разрешением ISO C11 и для совместимости с другими компиляторами GCC позволяет определять структуры или объединения, содержащие в качестве полей структуры и объединения без имён. Например:

struct {
  int a;
  union {
    int b;
    float c;
  };
  int d;
} foo;

В этом примере к членам безымянного объединения можно обращаться с помощью кода вроде ‘foo.b’. Обратите внимание: разрешены только безымянные структуры и объединения; например, безымянный int использовать нельзя.

Никогда не создавайте такие структуры, которые приводят к неоднозначным определениям полей. Например, в этой структуре:

struct {
  int a;
  struct {
    int a;
  };
} foo;

неоднозначно, какой именно a имеется в виду в ‘foo.a’. Для таких конструкций компилятор выдаёт ошибки.

Если не используется -fms-extensions, безымянное поле должно быть определением структуры или объединения без тега (например, ‘struct { int a; };’). Если используется -fms-extensions, поле также может быть определением с тегом, например ‘struct foo { int a; };’, ссылкой на ранее определённую структуру или объединение, например ‘struct foo;’, или ссылкой на имя typedef ранее определённого типа структуры или объединения.

Параметр -fplan9-extensions включает -fms-extensions, а также два других расширения. Во-первых, указатель на структуру автоматически преобразуется в указатель на анонимное поле при присваивании и вызове функций. Например:

struct s1 { int a; };
struct s2 { struct s1; };
extern void f1 (struct s1 *);
void f2 (struct s2 *p) { f1 (p); }

При вызове f1 внутри f2 указатель p преобразуется в указатель на анонимное поле.

Во-вторых, если тип анонимного поля — это typedef для struct или union, в коде можно обращаться к полю, используя имя typedef.

typedef struct { int a; } s1;
struct s2 { s1; };
s1 f1 (struct s2 *p) { return p->s1; }

Такое использование допускается только в тех случаях, когда оно не приводит к неоднозначности.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Unnamed-Fields.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API