2012-09-29 111 views
6

我有以下的工會:如何訪問C中的聯合中的結構成員?

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]; 

我如何可以訪問哪些是工會employee內的構造中的一員? 我試圖訪問manager結構的age成員這樣說:

company[i].manager.age

,但我得到error C2039: 'manager' : is not a member of 'employee'

回答

8

在標籤聲明後添加一些東西。也許:

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

旁註:你沒有使用工會的權利。關鍵字,即告訴您您是處理經理還是單純處理員工的字段應位於工會以外的封閉對象中。也許:

struct employee { 
    char key; 

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

由於dasblinkenlight筆記,你可以在歐盟以外聲明你的經理/工人標籤。

+0

+1關於使用'union'鍵的觀察非常好!你可能想提一下,'union'裏面的'struct'和'manager'不需要'struct'標籤。 – dasblinkenlight

+0

啊,現在我意識到我在那裏做了什麼...我完全錯過了使用工會的觀點。 – amiregelz

2

匿名結構/聯合不是C標準的一部分,而是一個不是非常普遍的GNU擴展。

在您的具體示例中,一些編譯器(主要是GCC)將允許您通過例如程序訪問管理員和工作者唯一變量。 company[i].sharescompany[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.agecompany[i].worker.skill等訪問結構元素。

請注意,在運行時無法測試您的聯盟是否包含密鑰,經理或工作人員。這必須事先知道。

另一件事:我不確定這是否是有意的,但是在您的聲明中,您無法與經理或工作人員一起保存密鑰。你的工會只包含一個的關鍵,經理或工人

+0

是的,我意識到,cnicutar指出後。然後我將它改爲:'struct company { \t char key; \t工會員工 \t { \t \t結構經理 \t \t { \t \t \t短整型年齡; \t \t \t浮動股份; \t \t \t short int level; \t \t} manager; \t \t結構工作者 \t \t { \t \t \t短整型年齡; \t \t \t短整型技巧; \t \t \t short int department; \t \t} worker; \t}員工; } comp [10];' – amiregelz

+0

實際上,匿名結構和聯合成員完全是標準C11。 – 00dani

0

這個錯誤是因爲你試圖通過結構本身的名稱訪問結構元素,這是無效的。爲了訪問結構的元素,首先應該創建一個對象。

以下代碼管理和工作分別是結構管理者和工作者的對象。

工會僱員 { char key;

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

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

} company [10];

現在

訪問u可以使用會員「公司[I] .manage.age」

0

您可以訪問成員,你想的方式(但是工會內部的結構應具有唯一成員),但你應該確保在編譯的代碼GCC應該知道,你正在嘗試這樣,

命令:gcc -fms-extensions file_name.c從C11支持。

喜歡:

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 
{ 
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編譯它會給編譯時間帶來錯誤。