È possibile (e legale) per assegnare un anonimo unione in un composto letterale?
-
19-09-2019 - |
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?
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.