2014-10-04 51 views
1

我在阅读lazyfoo的SDL2.0教程,在第三个教程中展示了如何使用SDL_Event,我去探索更多关于SDL_Event's tutorial page的SDL_Event,并找到它的联盟类型,但在他们使用的配售活动部分的页面上SDL_Event(一个联合)为用户分配两个值类型和其他值之一,我的疑问是如何将两个值分配给联盟而没有错误或非法赋值? 我确实再去检查工会的定义here但它也表示,你不能同时给工会分配两个值。我们如何能够在SDL_Event(联合)中分配两个值?

P.S. 在高于SDL链路的代码是:

SDL_Event user_event; 

user_event.type=SDL_USEREVENT; 
user_event.user.code=2; 
user_event.user.data1=NULL; 
user_event.user.data2=NULL; 
SDL_PushEvent(&user_event); 

回答

1

联盟使用一个一块内存,但访问该存储器可通过任何的“联合在一起”类型来完成。关键是不要将值(例如)分配给用户成员和鼠标成员。当你去读取值时,结果是未定义的。

换句话说,这是好的:

user_event.user.code=2; 
user_event.user.data1=NULL; 

但是,这并不:

user_event.user.code=2; 
// BAD! 'key' is from a different type in the union! 
user_event.key.state=SDL_PRESSED; 

现在,成员尤其是特殊的。 SDL与每个可能的事件类型中的第一个成员具有相同的变量(数据类型和名称)。它也与整个联盟的第一个成员具有相同的变量。这样,内存总是有这个类型变量第一,并且可以可靠地访问,无论它通过哪个工会成员访问。这是C规范中的一个特殊情况,其中“如果联合包含多个共享公共初始序列的结构,并且联合对象当前包含这些结构中的一个,则允许检查任何公共初始部分他们“。这是C89规范草案副本中的第3.3.2.3节。

+1

以及我的疑问是关于类型分配和用户分配,因为他们都是不同的类型,但正在分配上述sdl语句 – Amitesh 2014-11-15 06:37:54

+0

哦,我明白了。我刚刚更新了我的答案,以包括这一点。 – 2014-11-16 19:10:15

+0

嗯,谢谢@Jonny – Amitesh 2014-11-18 13:26:12

相关问题