SDL_Event是无符号8位类型的并集,以及许多结构,其第一个元素是无符号8位类型。推荐的用法是访问union的Uint8元素以确定事件的类型,然后通过适合该类型的元素访问union。
这显然取决于联合中具有为类型标识符保留的相同空间的所有类型。我们可以确定是这种情况,还是这种未定义的行为?
编辑:使标题更具描述性。
答案 0 :(得分:5)
结构的第一个元素保证与struct的开头“偏移0”。所以它应该是安全的。
答案 1 :(得分:4)
我发现它符合C99标准。
6.5.2.3.5:
为了简化联合的使用,我们做了一个特别的保证:如果一个联合包含 几个结构共享一个共同的初始序列(见下文),如果是联盟 对象当前包含这些结构中的一个,允许检查公共结构 任何一个声明完整类型的联盟的任何地方的初始部分 可见。如果相应的成员有两个结构共享一个共同的初始序列 对于一个或多个序列的兼容类型(以及对于位字段,相同的宽度) 初始成员。
所以看起来SDL实现接近于保证正确的东西。如果它使用仅包含Uint8的结构,那么它将得到保证,但我认为裸Uint8是未定义的行为,极有可能按预期工作。