Возможно ли (законно) назначить анонимное объединение в составном литерале?

StackOverflow https://stackoverflow.com/questions/1885854

Вопрос

У меня есть структура:

typedef struct _n
{
    int type;
    union {
        char *s;
        int i;
    };
} n;

Когда я пытаюсь присвоить составной литерал, например:

node n1 = {1, 0};
node n2 = {2, "test"};

gcc выдает мне несколько предупреждений, например:

warning: initialization makes pointer from integer without a cast
warning: initialization from incompatible pointer type

Ну, понятно, что компилятор не уверен, что я просто присвоил значение возможно неоднозначному типу.Однако, даже если я попытаюсь указать точнее:

node n0 = {type: 1, i: 4};

Я получил:

error: unknown field ‘i’ specified in initializer

Я читал, что если я поставлю (union <union name>) до i: тогда это может сработать.Однако я предпочитаю иметь анонимный профсоюз.Есть ли способ сделать это?

Это было полезно?

Решение

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

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

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

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} неверный синтаксис;похоже, вы пытались использовать назначенные инициализаторы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top