Подтвердить что ты не робот

Безымянный союз внутри союза

Я читаю код и нашел что-то вроде следующего:

typedef union {
    int int32;
    int boolean;
    time_t date;
    char *string;
    union {
        struct foo *a;
        struct foo *b;
        struct foo *c;
    };
} type_t;

С точки зрения синтаксиса внутренний союз {} можно удалить и иметь * a, * b и * c непосредственно внутри внешнего объединения {}. Итак, какова цель беспредметного объединения?

4b9b3361

Ответ 1

Без названия union/struct внутри другого union/struct является функцией C11 и некоторыми расширениями компилятора (например, GCC).

C11 §6.7.2.1 Спецификации структуры и объединения

13 Неименованный элемент, спецификатор типа которого является спецификатором структуры без тега, называется анонимной структурой; неназванный член, спецификатор типа которого является спецификатором объединения без тега, называется анонимным объединением. Члены анонимной структуры или объединения считаются членами структуры или объединения. Это применяется рекурсивно, если содержащая структура или объединение также анонимны.

Преимущество этой функции заключается в том, что легче получить доступ к ее неназванному полю объединения:

type_t x;

Чтобы получить доступ к полю a, вы можете просто использовать x.a. Сравните с кодом без использования этой функции:

typedef union {
    int int32;
    int boolean;
    time_t date;
    char *string;
    union u{      //difference in here
    struct foo *a;
    struct foo *b;
    struct foo *c;
    };
} type_t;

type_t x;

Вам нужно использовать x.u.a.

Связано: неназванная структура/объединение в C

Ответ 2

Я думаю, что предполагаемый прецедент - это скорее "анонимный союз внутри структуры", а поведение "анонимного союза внутри союза", такое же, как "плоский" союз, является приемлемым компромиссом для согласованности.

Ответ 3

Позволяет использовать один и тот же указатель a, b или c. Возможно, есть какой-то унаследованный код, который не может согласиться с тем, какое имя использовать.