6.60 Неименованные поля структур/объединений внутри структур/объединений
В соответствии с 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-4.9.4/gcc/Unnamed-Fields.html