2012-09-29 3 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' 안에서'worker'와'manager'에'struct' 태그를 줄 필요는 없습니다. – dasblinkenlight

+0

아, 이제 내가 그곳에서 무엇을했는지 깨닫는다. 나는 노조를 사용하는 것에 대해 완전히 놓쳤다. – amiregelz

2

익명 구조체/공용체는 C 표준의 일부가 아니며 널리 퍼진 GNU 확장이 아닙니다.

예를 들어 일부 컴파일러 (주로 GCC)에서는 관리자 및 작업자 고유 변수에 액세스 할 수 있습니다. company[i].shares 또는 company[i].department이지만 company[i].age은 모호하며 컴파일러는 어느 것이 의미하는지 알 수 없습니다. 당신의 접근 방식은이 문제를 해결하는 방법은 두 가지가있는 경우에도 유효 C.

하지 않은

union { 
     int num; 
     float num; 
} union_number; 

을 정의하기 위해 노력하고 비슷합니다.

가) 구조체 (악한 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]; 

나에 대해 알고, 그렇게하지 마십시오) 또는 더 깨끗하고 표준화 된 방법은 구조체 이름을 지정합니다 :

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과를 통해 구조체의 요소에 액세스 할 수 있습니다.

런타임에 노동 조합에 키, 관리자 또는 작업자가 포함되어 있는지 테스트 할 수있는 방법이 없음에 유의하십시오. 그것은 미리 알려 져야합니다.

또 다른 한가지 : 이것이 의도 된 것인지 확신 할 수 없지만 선언에서 관리자 나 작업자와 함께 키를 저장할 수 없습니다. 유니온에는 키, 관리자 또는 작업자 중 하나만이 포함되어 있습니다.

+0

그래, 나는 그걸 cnicutar가 지적한 후에 깨달았다.나는 다음과 같이 변경했다.'struct company { \t char key; \t 조합 직원 \t { \t \t 구조체 관리자 \t \t { \t \t \t 짧은 INT 시대; \t \t \t float shares; \t \t \t 짧은 int 수준; \t \t} 관리자; \t \t 구조체 노동자 \t \t { \t \t \t 짧은 INT 시대; \t \t \t 짧은 int 기술; \t \t \t 짧은 int 부서; \t \t} 작업자; \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; 

} 회사 [10]; 지금

U 사용할 수있는 멤버에 액세스하는 "기업 [i]를 .manage.age"

0

당신은, 당신이하려고하는 방법을 멤버에 액세스 할 수 있습니다 (그러나 노조 내부에있는 구조가 독특한 멤버가 있어야합니다)하지만 당신은

명령 코드를 컴파일하는 동안 GCC 당신이 그렇게하려고하는 것을 알아야한다 있는지 확인해야합니다 : C11에서 지원 gcc -fms-extensions file_name.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]; 

이 기본적으로 컴파일 오류를 제공합니다.

그래서 당신은 당신의 코드를 변경하는 경우 :

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를 지정하지 않는 한.

관련 문제