2011-02-17 4 views
0

길기는하지만 유감이지만 설명하는 것은 약간 복잡합니다.여러 파일에 C++ 유니온이 있습니다.

우리는 최근의 숙제를 위해 다음과 같은 프로그램 (많은 여기 간체)에 손을했다 :

  • 데이터의 물리적 블록을 나타내는 구조의 일부 유형 (클래스/구조체) (단 문자 [1024])

    struct p { 
        char[1024] 
    } 
    struct l1 { 
        int num; 
        char name[20]; 
    } 
    struct l2 { 
        int num; 
        char type[10]; 
        char filler[400]; 
        bool flag; 
    } 
    
    이 블록 예

논리적 파티셔닝

  • 두 종류 실제 물건을 별도의 파일에 다음이 될 것이 었 0

    나에게 분명한 것은 노동 조합

    union { 
        p phy; 
        l1 logi1; 
        l2 logi2; 
    } 
    

    을 가지고 있었지만 문제는 사양 (나는 그것을 단순화하기 위해 절단 부분)의 일부분이었다 논리적 인 것들.

    이제는 질문입니다 : 공용 영역에 필드를 추가하는 방법이 있습니까? 아니면 '실제'파일에서 '논리'블록을 허용하고 원시 블록으로 사용하는 다른 방법이 있습니까?

    분명히하는 것이 좋겠습니다.

    P. 이것은 이미 만기가되었고 reinterpret_cast으로 해결했습니다. 좀 더 우아한 방법이 있는지 궁금 해서요.

  • +0

    엄격한 앨리어싱 규칙을 위반할 수 있으므로'reinterpret_cast'로이 문제를 해결할 수 없습니다. –

    +0

    @Let_Me_Be 엄격한 앨리어싱 규칙이란 무엇입니까? – baruch

    +0

    @ baruch http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule –

    답변

    0

    아니요, 유형의 전체 구조를 함께 정의해야합니다. 나중에 유형을 정의하기 위해 유형을 "다시 열 수 없습니다".

    여기에 명시된 과제는 3 가지 유형을 요구했지만 하나의 유형은 3 가지를 요구하지 않았습니다. 처음 세 가지 구조체 정의로 충분했습니다.

    세 개의 구조체가 모두 정의 되었으면 유니온 유형을 정의 할 수 있습니다. 아마도 이런 식으로 :

    #include "physical.h" 
    #include "logical.h" 
    
    union combined_structure { 
        p phy; 
        l1 logi1; 
        l2 logi2; 
    }; 
    
    +0

    물리적 인 부분에있는 함수가 '논리적 인'블록으로 표현 된 데이터의 '블록'을 받아 들일 필요가있었습니다. – baruch

    0

    두 개의 공용체를 만들 수 있습니다. 교환하지 않는 한 괜찮을 것입니다.