2009-12-11 8 views
5

que tienen una estructura:¿Es posible (legal) asignar una unión anónima en un literal compuesto?

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

Cuando intento para asignar un compuesto literal, como:

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

gcc me da algunas advertencias tales como:

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

Bueno, es claro que el compilador no está seguro de que yo simplemente asigne un valor a un tipo posiblemente ambiguo. Sin embargo, incluso si trato de especificar con mayor precisión:

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

me sale:

error: unknown field ‘i’ specified in initializer 

He leído que si pongo (union <union name>) antes i: entonces se puede trabajar. Sin embargo, prefiero tener una unión anónima. ¿Hay una manera de hacerlo?

Respuesta

7

Las uniones anónimas no son estándar C: son una extensión del compilador. Recomiendo darle un nombre a la unión. Si usted insiste en el uso de una unión anónima, a continuación, sólo se puede dar un inicializador para el primer elemento de la misma:

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

cuando se compila con -Wall -Wextra -pedantic, gcc me dio la advertencia "llaves alrededor del inicializador perdido", que es una advertencia válida El inicializador en realidad se debe especificar la siguiente manera:

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

Ahora bien, esto sólo se da una advertencia de que "ISO C no soporta sin nombre structs/sindicatos".

Si usted le da la unión de un nombre, entonces usted puede utilizar una función llamada C99 inicializadores designados para inicializar un miembro específico de la unión:

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

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

Usted necesita la unión de tener un nombre; de lo contrario, el compilador se quejará del inicializador designado dentro de él.

La sintaxis que intentaba usar node n0 = {type: 1, i: 4} es una sintaxis no válida; parece que estabas tratando de usar los inicializadores designados.

+0

Me sorprendió la primera vez que lo vi, pero para GCC eso es legal (aunque desaprobado) la sintaxis del inicializador designado. – ephemient

+0

que (supongo que desaprobado) la sintaxis del inicializador que obtuve al leer algún código del módulo kernel ... las estructuras 'fops' a menudo se escriben de esa manera. voy a cambiar a la forma C99 ahora. Lástima de los sindicatos anónimos, no sabía que no eran estándar, gracias por aclararme eso. – Steve

Cuestiones relacionadas