2010-05-16 4 views
0

요 전날에 조합에 대해 읽었고 함께 제공된 샘플 함수를 시도했습니다. 쉬운 일이지만, 결과는 명확하고 완전히 쓰레기였습니다.Union 구조체가 구조체 명명법에 대한 가비지와 일반적인 질문을 생성합니다.

첫번째 예는 다음의 int 상정

union Test 
{ 
    int Int; 

    struct 
    { 
     char byte1; 
     char byte2; 
     char byte3; 
     char byte4; 
    } Bytes; 
}; 

32 비트를 갖는. 나는 값 Test t; t.Int = 7;을 설정 한 다음

cout << t.Bytes.byte1 << etc...

개별 바이트를 법원 후, 거기에 아무것도 표시되지 않습니다,하지만 내 컴퓨터에서 경고음이 발생합니다. 나는 꽤 이상하게 보입니다.

두 번째 예는 더 나쁜 결과를 나타냅니다.

union SwitchEndian 
{ 
    unsigned short word; 

    struct 
    { 
     unsigned char hi; 
     unsigned char lo; 
    } data; 
} Switcher; 

내 의견으로는 조금 어색해 보인다. 심지어에서 정의되지 cout << Switcher.data.hi << endl

와 문자 이것의 결과를 한 호출

Switcher.word = 7656; 같은 값을 설정할 때 어쨌든, 그것이 말하는 설명에서이 자동 높은/리틀 엔디안 형식으로 결과를 저장한다 ASCII 차트. 왜 그 사람들이 나타나는지 모르겠습니다.

마지막으로 구조체 끝에 Bytes를 배치하는 대신에 바로 옆에 배치하여 예제를 수정하려고 할 때 오류가 발생했습니다. 그래서 그 대신

struct {} Bytes;

의 나는

struct Bytes {};

이 나에게 큰 팔자 '오류를 던져 쓰고 싶었다. 이것들의 차이점은 무엇입니까? C++은 무명의 구조체를 가질 수 없기 때문에, 처음과 끝 부분에 위치한 Byte가 이름을 짓는 것처럼 보였습니다. 아니오를 제외하고, 그것은 내가 생각하는 전체 답변이 아닙니다. 그럼 뭐야?

답변

2

기술적으로 마지막으로 작성된 멤버가 아닌 다른 멤버의 멤버에서 읽으면 정의되지 않은 동작이 발생하므로 마지막으로 값을 Int으로 지정하면 Bytes의 값을 읽을 수 없습니다. StackOverflow에 대한이 토론, 예를 들어, in this answer to another question).

Chris Schmich gives a good explanation 왜 내가 경고음을 듣고 제어 문자를 보는지, 그래서 반복하지 않을 것입니다.

최종 질문 인 경우 struct {} Bytes;은 익명의 struct Bytes이라는 인스턴스를 선언합니다. 그것은 말과 유사하다 : 당신이 다른 곳 BytesType을 참조 할 수 있다는 점을 제외하고

struct BytesType {}; 
BytesType Bytes; 

. struct Bytes {};Bytes이라는 구조체를 정의하지만 인스턴스를 선언하지 않습니다.

3

경고음과 이상한 기호는 십진수의 문자 표현을 인쇄하려고하기 때문에 발생합니다 (이 경우, ASCII control characters). 첫 번째 예 (경고음)에는 bell character 인 ASCII 7이 인쇄됩니다.

당신은

cout << (int)t.Bytes.byte1 << endl << (int)t.Bytes.byte2 << endl << (int)t.Bytes.byte3 << endl << (int)t.Bytes.byte4 << endl; 

당신은 메모리에 그 unsigned char 값의 소수점 표현을 볼 수있는 두 번째 예를 들어 비슷한 작업을 수행 할 수 있습니다 : 실제 진수 표현에서 예컨대을 인쇄 할 수 int에 데이터를 전송할 수 있습니다.

차이점은 cout 유형이 basic_ostream이고 다양한 기본 유형에 대해 operator<<에 대해 여러 과부하가 발생했기 때문입니다.

최근 호에는 어떤 컴파일러 오류가 발생합니까? VS2008을 사용할 때 두 구조체 정의 모두 나를 잘 컴파일합니다.