10

私は次の組合を持っています:

union employee
{
    char key;

    struct manager
    {
        short int age;
        float shares;
        short int level;
    };

    struct worker
    {
        short int age;
        short int skill;
        short int department;
    };

} company[10];

union 内にある構造体のメンバーにアクセスするにはどうすればよいemployeeですか? この方法で構造体のageメンバーにアクセスしようとしました:manager

company[i].manager.age

しかし、私は得るerror C2039: 'manager' : is not a member of 'employee'

4

4 に答える 4

14

タグ宣言の後に何かを追加します。多分:

struct manager
{
    short int age;
    float shares;
    short int level;
} manager;

サイドノート:組合権を使用していません。キー、つまり、管理者を扱っているのか、単なる労働者を扱っているのかを示すフィールドは、 union の外側の囲みオブジェクトにある必要があります。多分:

struct employee {
    char key;

    union {
        struct manager ...;
        struct worker ...;
    } u;
};

dasblinkenlightが指摘しているように、union の外で manager/worker タグを宣言できます。

于 2012-09-29T14:23:35.653 に答える
4

匿名の構造体/共用体は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つだけが含まれています

于 2012-09-29T17:51:50.457 に答える
0

試している方法でメンバーにアクセスできます(ただし、ユニオン内の構造には一意のメンバーが必要です)が、コードのコンパイル中にgccがそのようにしようとしていることを認識していることを確認する必要があります。

コマンド : gcc -fms-extensions file_name.cc11 からサポートします。

お気に入り :

union employee
{
char key;

struct manager
{
    short int age;
    float shares;
    short int level;
};

struct worker
{
    short int age;
    short int skill;
    short int department;
};
} company[10];

これは、manager と worker のメンバーの間にあいまいさがあるため、基本的にコンパイル エラーが発生します。

したがって、コードを次のように変更すると:

union employee
{
char key;

struct manager
{
    short int age;
    float shares;
    short int level;
};

struct worker
{
    short int age1;
    short int skill;
    short int department;
};

} company[10];

または、ユニオンの下に直接保持することもできます。

コンパイル中に指定しない-fms-extensionsと、コンパイル時にエラーが発生します。

于 2015-04-11T14:10:30.820 に答える