匿名の構造体/共用体はC標準の一部ではなく、あまり普及していないGNU拡張機能です。
company[i].shares
特定の例では、一部のコンパイラ(主にGCC)を使用すると、egまたはを介してマネージャとワーカーの一意の変数にアクセスできますcompany[i].department
が、company[i].age
あいまいであり、コンパイラはどちらが意味するのかわかりません。あなたのアプローチは、定義しようとすることに似ています
union {
int num;
float num;
} union_number;
これは有効なCでもありません。
これを解決するには2つの方法があります。
a)共有属性を構造体の外に移動する(邪悪なGNUの方法、そうしないでください。iccはこれをコンパイルすらしないという事実を知っています)
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つだけが含まれています