匿名結構/聯合不是C標準的一部分,而是一個不是非常普遍的GNU擴展。
在您的具體示例中,一些編譯器(主要是GCC)將允許您通過例如程序訪問管理員和工作者唯一變量。 company[i].shares
或company[i].department
,但company[i].age
是不明確的,編譯器不知道哪一個意思。你的方法類似於試圖定義
union {
int num;
float num;
} union_number;
這甚至不是有效C.
有兩種方法可以解決這個問題。
一)移動的結構(邪惡的GNU道外共享的屬性,請不這樣做,我知道一個事實,即國際刑事法院甚至不編譯這個)
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)或更清潔的標準化的方式來命名您的結構:
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];
在這種情況下,你將能夠通過company[i].manager.age
,company[i].worker.skill
等訪問結構元素。
請注意,在運行時無法測試您的聯盟是否包含密鑰,經理或工作人員。這必須事先知道。
另一件事:我不確定這是否是有意的,但是在您的聲明中,您無法與經理或工作人員一起保存密鑰。你的工會只包含一個的關鍵,經理或工人
+1關於使用'union'鍵的觀察非常好!你可能想提一下,'union'裏面的'struct'和'manager'不需要'struct'標籤。 – dasblinkenlight
啊,現在我意識到我在那裏做了什麼...我完全錯過了使用工會的觀點。 – amiregelz