Действительно ли это возможно (законный) для присвоения анонимного объединения в составном литерале?

Ищите немного значка буфера обмена, который открывается в конце материала, который Вы вставили. Нажмите на это и выберите "keep text only".

5
задан timrau 2 May 2016 в 16:27
поделиться

1 ответ

Анонимные объединения не являются стандартом C - они являются расширением компилятора. Я настоятельно рекомендую дать профсоюзу имя. Если вы настаиваете на использовании анонимного объединения, тогда вы можете указать инициализатор только для первого его элемента:

node n0 = {1, 0};  // initializes `s' to 0

При компиляции с -Wall -Wextra -pedantic , gcc выдал мне предупреждение «недостающие фигурные скобки around initializer ", что является допустимым предупреждением. Инициализатор на самом деле должен быть указан следующим образом:

node n0 = {1, {0}};  // initializes `s' to 0

Теперь это дает только предупреждение о том, что «ISO C не поддерживает безымянные структуры / объединения».

Если вы дадите объединению имя, вы можете использовать функцию C99 вызываемые назначенные инициализаторы для инициализации конкретного члена объединения:

typedef struct
{
    int type;
    union {
        char *s;
        int i;
    } value;
} node;

node n0 = {1, { .s = "string"; }};
node n1 = {2, { .i = 123; }};

Вам нужно, чтобы объединение имело имя; иначе, компилятор будет жаловаться на назначенный внутри него инициализатор.

Синтаксис, который вы пытались использовать node n0 = {type: 1, i: 4} , является недопустимым синтаксисом; похоже, вы пытались использовать назначенные инициализаторы.

7
ответ дан 14 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: