Estructuras/uniones anónimas no es parte del estándar C, sino una extensión de GNU no muy extendida.
En su ejemplo particular, algunos compiladores (principalmente GCC) le permitirán acceder a las variables únicas del administrador y del trabajador a través, p. Ej. company[i].shares
o company[i].department
, pero company[i].age
es ambiguo y el compilador no sabrá a qué se refiere. Su enfoque es similar al tratar de definir
union {
int num;
float num;
} union_number;
que ni siquiera es válida C.
hay dos maneras de resolver esto.
a) mover los atributos compartidos fuera de la estructura (la forma de GNU mal, por favor, no hagas eso, sé que es un hecho que la CPI no tiene ni siquiera compilar este)
union employee
{
char key;
struct person {
short int age;
union {
struct manager
{
float shares;
short int level;
};
struct worker
{
short int skill;
short int department;
};
}
};
} company[10];
b) o la forma estandarizada más limpia para nombrar sus estructuras:
union employee
{
char key;
struct manager
{
short int age;
float shares;
short int level;
} manager;
struct worker
{
short int age;
short int skill;
short int department;
} worker;
} company[10];
en este caso, usted será capaz de acceder a los elementos a través de struct company[i].manager.age
, company[i].worker.skill
y así sucesivamente.
Tenga en cuenta que en el tiempo de ejecución no hay manera de comprobar si su sindicato contiene una clave, un gerente o un trabajador. Eso debe saberse de antemano.
Otra cosa: no estoy seguro de si esto es así, pero en su declaración no puede guardar una clave junto con un gerente o un trabajador. Su sindicato contiene solo uno de clave, gerente o trabajador
+1 ¡La observación sobre el uso de la tecla 'union' es excelente! Es posible que desee mencionar que no es necesario dar etiquetas 'struct' a' worker' y 'manager' dentro de' union'. – dasblinkenlight
Ah, ahora me doy cuenta de lo que hice allí ... Me olvidé por completo de usar una unión. – amiregelz