2

SDL_Event是无符号 8 位类型和许多第一个元素是无符号 8 位类型的结构的联合。推荐的用法是访问 union 的 Uint8 元素来确定事件是什么类型,然后通过适合该类型的元素访问 union。

这显然取决于联合中的所有类型都为类型标识符保留相同的空间。我们可以确定是这种情况,还是这种未定义的行为?

编辑:使标题更具描述性。

4

2 回答 2

5

保证结构的第一个元素位于结构开头的“偏移量 0”处。所以应该是安全的。

于 2011-01-12T16:11:26.737 回答
4

我在 C99 标准中找到了它。

6.5.2.3.5:

一个特殊的保证是为了简化联合的使用:如果一个联合包含多个共享一个公共初始序列的结构(见下文),并且如果联合对象当前包含这些结构之一,则允许检查公共它们中的任何一个的初始部分,任何地方的完整类型的联合声明都是可见的。如果对应的成员对于一个或多个初始成员的序列具有兼容的类型(并且对于位域,具有相同的宽度),则两个结构共享一个共同的初始序列。

所以看起来 SDL 实现接近于保证正确的东西。如果它使用仅包含 Uint8 的结构,则可以保证,但我认为裸 Uint8 是未定义的行为,极有可能按预期工作。

于 2011-01-12T17:30:22.260 回答