2015-08-31 76 views
3

據我瞭解在C 工會可以一次只持有1值,我真的不明白這個代碼用C如何有道理的,因爲event.window無法填充同時event.typeÇ工會 - 請解釋

while(SDL_PollEvent(&event)) { 
switch(event.type) 
{ 
case SDL_WINDOWEVENT: 
    switch(event.window.event) 

該事件被定義爲:

typedef union SDL_Event 
{ 
    Uint32 type;     /**< Event type, shared with all events */ 
    SDL_CommonEvent common;   /**< Common event data */ 
    SDL_WindowEvent window;   /**< Window event data */ 
    SDL_KeyboardEvent key;   /**< Keyboard event data */ 
    SDL_TextEditingEvent edit;  /**< Text editing event data */ 
    SDL_TextInputEvent text;  /**< Text input event data */ 
    SDL_MouseMotionEvent motion; /**< Mouse motion event data */ 
    SDL_MouseButtonEvent button; /**< Mouse button event data */ 
    SDL_MouseWheelEvent wheel;  /**< Mouse wheel event data */ 
    SDL_JoyAxisEvent jaxis;   /**< Joystick axis event data */ 
    SDL_JoyBallEvent jball;   /**< Joystick ball event data */ 
    SDL_JoyHatEvent jhat;   /**< Joystick hat event data */ 
    SDL_JoyButtonEvent jbutton;  /**< Joystick button event data */ 
    SDL_JoyDeviceEvent jdevice;  /**< Joystick device change event data */ 
    SDL_ControllerAxisEvent caxis;  /**< Game Controller axis event data */ 
    SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */ 
    SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */ 
    SDL_QuitEvent quit;    /**< Quit request event data */ 
    SDL_UserEvent user;    /**< Custom event data */ 
    SDL_SysWMEvent syswm;   /**< System dependent window event data */ 
    SDL_TouchFingerEvent tfinger; /**< Touch finger event data */ 
    SDL_MultiGestureEvent mgesture; /**< Gesture event data */ 
    SDL_DollarGestureEvent dgesture; /**< Gesture event data */ 
    SDL_DropEvent drop;    /**< Drag and drop event data */ 

    /* This is necessary for ABI compatibility between Visual C++ and GCC 
     Visual C++ will respect the push pack pragma and use 52 bytes for 
     this structure, and GCC will use the alignment of the largest datatype 
     within the union, which is 8 bytes. 

     So... we'll add padding to force the size to be 56 bytes for both. 
    */ 
    Uint8 padding[56]; 
} SDL_Event; 
+2

其他聯合事件以'Uint32類型開始;' – Jarod42

+1

'聯合'由相同二進制數據的不同「視點」組成。您可以分配所有可能的聯合成員,但每個下一個分配都會覆蓋之前存儲的值。 – i486

+0

C++標記可能是錯誤的。 –

回答

4

每骨料(struct小號大概)成員SDL_CommonEvent common;SDL_WindowEvent window;SDL_KeyboardEvent key;等... union SDL_Event的開始與一些Uint32字段,以type和常見的type字段在每個聯盟成員中具有相同的地址和大小。

因此,雖然的確是工會在內存中進行一次只有一個字段(換句話說,所有的工會成員有相同的地址),他們每個人開始用typeevent.type是有道理的;它提取type

這樣一個習慣用法是C中實現​​3210的常用方法。

+0

有趣,謝謝! –

4

SDL_Event聯盟的每個成員都以相同的兩個成員Uint32 typeUint32 timestamp開頭。 C標準特別指出,如果聯合當前持有一個結構類型的值,但是作爲另一個結構類型(其第一個成員與另一個結構類型相匹配)讀取,則可以閱讀這些匹配成員。

2

所有其他SDL_X類型都以32位類型開頭。事實上,他們似乎都在開頭包括SDL_CommonEvent的字段。這是爲了便於訪問所有子結構的共同元素。然後,通過event.common.x,您可以訪問所有常見元素,而無需區分事件的確切類型。