2011-01-12 20 views
2

SDL_Event是一個無符號8位類型的聯合,以及許多其第一個元素是無符號8位類型的結構。建議的用法是訪問聯合的Uint8元素以確定事件的類型,然後通過適合該類型的元素訪問聯合。結構的聯合是否共享第一個元素未定義的行爲?

這顯然取決於聯合中具有爲類型標識保留相同空間的所有類型。我們可以確定這是事實,還是這種未定義的行爲?

編輯:使標題更具描述性。

+0

你在談論什麼是「類型標識符」? uint8_t或其他什麼? C聯盟並不固有地存儲他們的類型。 – 2011-01-12 18:37:02

+0

@R ..是的,Uint8,我相信是typedef'd uint8_t。 – 2011-01-12 18:42:20

回答

5

結構的第一個元素保證位於結構開始的「偏移量0」處。所以它應該是安全的。

4

我發現它在C99標準。

6.5.2.3.5:

一個特殊的保障是爲了簡化使用工會提出:如果一個聯合包含 共享一個公共初始序列幾種結構(見下文),如果工會 對象當前包含這些結構中的一個,允許檢查它們中的任何一個的共同的 的初始部分,其中該結合的完整類型的聲明是可見的 。如果對應的成員對一個或多個初始成員的序列具有兼容的類型(並且對於位域,寬度相同),則兩個結構共享一個共同的初始序列。

所以它看起來像SDL實現接近保證是正確的東西。如果它使用的是隻包含Uint8的結構,那麼它將得到保證,但我認爲裸Uint8是未定義的行爲,極有可能按預期工作。

相關問題