Только для разъяснений по поводу анонима struct
или анонима union
.
C11
6.7.2.1 Спецификаторы структуры и объединения
неназванный член , спецификатор типа которого является структурным спецификатором с без тега , называется анонимная структура ; неназванный член , спецификатор типа которого является спецификатором объединения с без тега , называется анонимным объединением .Члены анонимной структуры или объединения считаются членами содержащей структуры или объединения.Это применяется рекурсивно, если содержащая структура или объединение также являются анонимными.
C99 Не существует анонимной структуры или объединения
Упрощено: Спецификатор типа Идентификатор {
Список объявлений }
Теги ;
- Спецификатор типа :
struct
или union
; - Идентификатор : необязательно, пользовательское имя для
struct
или union
; - Объявление-список : члены, ваши переменные, анонимные
struct
и анонимные union
- Теги : необязательно.Если у вас
typedef
перед Спецификатором типа , Теги являются псевдонимами, а не Теги .
Он является анонимным struct
или анонимным union
только в том случае, если у него нет идентификатора и тега, и он существует внутри другого struct
или union
.
struct s {
struct { int x; }; // Anonymous struct, no identifier and no tag
struct a { int x; }; // NOT Anonymous struct, has an identifier 'a'
struct { int x; } b; // NOT Anonymous struct, has a tag 'b'
struct c { int x; } C; // NOT Anonymous struct
};
struct s {
union { int x; }; // Anonymous union, no identifier and no tag
union a { int x; }; // NOT Anonymous union, has an identifier 'a'
union { int x; } b; // NOT Anonymous union, has a tag 'b'
union c { int x; } C; // NOT Anonymous union
};
typedef
ад: если выtypedef
часть тега больше не является тегом, это псевдоним для этого типа.
struct a { int x; } A; // 'A' is a tag
union a { int x; } A; // 'A' is a tag
// But if you use this way
typedef struct b { int x; } B; // 'B' is NOT a tag. It is an alias to struct 'b'
typedef union b { int x; } B; // 'B' is NOT a tag. It is an alias to union 'b'
// Usage
A.x = 10; // A tag you can use without having to declare a new variable
B.x = 10; // Does not work
B bb; // Because 'B' is an alias, you have to declare a new variable
bb.x = 10;
В приведенном ниже примере просто измените struct
на union
, работайте так же.
struct a { int x; }; // Regular complete struct type
typedef struct a aa; // Alias 'aa' for the struct 'a'
struct { int x; } b; // Tag 'b'
typedef struct b bb; // Compile, but unusable.
struct c { int x; } C; // identifier or struct name 'c' and tag 'C'
typedef struct { int x; } d; // Alias 'd'
typedef struct e { int x; } ee; // struct 'e' and alias 'ee'