2012-05-23 19 views
6

Teniendo en cuenta lo siguiente:C Unión polimorfismo dentro de matrices

typedef struct{ 
... 
... 
} A; 

typedef struct{ 
... 
... 
} B; 

typedef union __attribute__((transparent_union)) { 
    A a; 
    B b; 
} C; 

Si declaro una función

myMethod(C){ 
... 
} 

El siguiente es legal sin conversión explícita:

A myA; 
B myB; 

meMethod(myA); 
myMethod(myB); 

(a partir de: " c unions and polymorphism ")

Sin embargo, ¿por qué no se permite lo siguiente?

C cArray[2]; 
c[0]=myA; 
c[1]=myB; 

Esto produce un error de tipo incompatible sin conversión explícita. ¿Hay alguna forma de evitar el lanzamiento explícito?

+1

Por favor, edite su pregunta ya que no es legal C tal como está. C [2] cArray debería ser C cArray [2]. Entonces c [0] yc [1], deberían ser Array [0] y Array [1]. – betabandido

+3

'transparent_union' solo es transparente al pasar parámetros a las funciones. La documentación de GCC es muy explícita al respecto. –

+0

Siempre puedes simplemente agregar el .a o el .b, pero eso no funciona, ¿verdad? –

Respuesta

3

Los GCC documentation estados:

este atributo, unidos a una definición de tipo de unión, indica que cualquier parámetro de la función que tienen ese tipo de unión provoca que las llamadas a la función para ser tratados de una manera especial.

En otras palabras, la transparencia solo se aplica a los parámetros de la función.