Domanda

Ho una struct:

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

Quando si tenta di assegnare un valore letterale composto, come:

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

gcc dà alcune avvertenze quali:

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

Beh, è chiaro che il compilatore non è sicuro a me basta assegnare un valore a una possibilmente tipo ambiguo.Tuttavia, anche se cerco di specificare più precisamente:

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

Ottengo:

error: unknown field ‘i’ specified in initializer

Ho letto che se metto (union <union name>) prima i: quindi potrebbe funzionare.Tuttavia, io preferisco avere un anonimo unione.C'è un modo per farlo?

È stato utile?

Soluzione

Anonimo sindacati non sono standard C -- sono un compilatore estensione.Raccomando caldamente di dare all'unione un nome.Se ti ostini a usare un anonimo unione, allora si può solo dare un inizializzatore per il primo elemento di esso:

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

Quando viene compilato con -Wall -Wextra -pedantic, gcc mi ha dato l'avviso "mancanti parentesi graffe inizializzatore", che è un valido avviso.L'inizializzatore in realtà dovrebbe essere specificato come questo:

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

Ora, questo solo dà un messaggio di avviso che "ISO C non supporta senza nome struct/sindacati".

Se è dare all'unione un nome, quindi è possibile utilizzare un C99 funzione chiamata designati gli inizializzatori per inizializzare un determinato stato membro dell'unione:

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

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

È necessario che l'unione dispone di un nome;in caso contrario, il compilatore si lamenta l'inizializzatore designato all'interno di esso.

La sintassi si stavano cercando di utilizzare node n0 = {type: 1, i: 4} è una sintassi non valida;sembra che si sta tentando di utilizzare designati gli inizializzatori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top