2011-01-12 3 views
2

SDL_Event은 부호없는 8 비트 유형의 합집합이며 첫 번째 요소가 부호없는 8 비트 유형 인 많은 구조체입니다. 권장되는 사용법은 유니온의 Uint8 요소에 액세스하여 어떤 유형의 이벤트인지 확인한 다음 해당 유형에 적합한 요소로 유니온에 액세스하는 것입니다.첫 번째 요소를 공유하는 구조체의 조합은 정의되지 않은 동작입니까?

분명히 유형 식별자에 대해 예약 된 동일한 공간을 갖는 공용체의 모든 유형에 따라 다릅니다. 이것이 사실인지 또는 정의되지 않은 동작인지 확인할 수 있습니까?

편집 : 제목을 더 잘 묘사했습니다.

+0

당신이 말하는 "유형 식별자"는 무엇입니까? 'uint8_t' 또는 다른 것? C 노조는 본질적으로 형식을 저장하지 않습니다. –

+0

@R .. 네, Uint8은 uint8_t에 typedef 된 것이라고 믿습니다. –

답변

5

구조체의 첫 번째 요소는 구조체의 시작 부분에서 "오프셋 0"에 있어야합니다. 그래서 안전해야합니다.

4

C99 표준에서 발견되었습니다.

6.5.2.3.5 :

한 특별 보증은 노동 조합의 사용을 단순화하기 위해 만든 : 노조 경우 노조가 공통의 초기 시퀀스를 공유 여러 구조를 포함하는 경우 (아래 참조), 그리고 개체에는 현재 이러한 구조 중 하나가 포함되어 있으므로 공용 구조체의 전체 형식이 인 모든 위치에서 해당 부분의 공통 부분 인 을 검사 할 수 있습니다. 하나 이상의 초기 멤버의 시퀀스에 대해 해당 멤버가 호환 유형 (비트 필드의 경우 동일한 너비)을 갖는 경우 두 구조가 공통 초기 시퀀스를 공유합니다.

그래서 SDL 구현이 올바른 것으로 보장 된 것과 비슷합니다. Uint8 만 포함 된 구조체를 사용하는 경우 보장 할 수 있지만 누드 Uint8은 예상대로 작동하지 않을 가능성이 매우 높은 정의되지 않은 동작입니다.

+0

당신 말이 맞아요. 나는 표준의 다른 버전에서 그것을 보았거나 그것을 상상했을 수도있다 :) – Jester

관련 문제