Anonymous structs/unions is not part of the C standard, but rather a not very widespread GNU extension.
In your particular example some compilers (mainly GCC) will allow you to access manager and worker unique variables via e.g. company[i].shares
or company[i].department
, but company[i].age
is ambiguous and the compiler will not know which one is meant. Your approach is similar to trying to define
union {
int num;
float num;
} union_number;
which is not even valid C.
there are two ways to solve this.
a) moving the shared attributes outside the struct (the evil GNU way, please don't do that, I know for a fact that icc does not even compile this)
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) or the more clean standardized way to name your structs:
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];
in this case you will be able to access the struct elements via company[i].manager.age
, company[i].worker.skill
and so on.
Please pay attention that at runtime there is no way to test whether your union contains a key, a manager or a worker. That must be known in advance.
Another thing: I am not sure if this is intended, but in your declaration you cannot save a key together with a manager or a worker. Your union contains only one of key, manager or worker