包含“类型”成员的联合

2024-04-24

关于工会,我有一个关于我仍然不明白的问题。我读过它们的很多用途,并且大部分都可以看到它们如何有用并理解它们。我已经看到它们可以提供原始的“C 风格”多态性。我在几个网站上看到的例子是 SDL 的事件联盟:

typedef union {
 Uint8 type;
 SDL_ActiveEvent active;
 SDL_KeyboardEvent key;
 SDL_MouseMotionEvent motion;
 SDL_MouseButtonEvent button;
 SDL_JoyAxisEvent jaxis;
 SDL_JoyBallEvent jball;
 SDL_JoyHatEvent jhat;
 SDL_JoyButtonEvent jbutton;
     SDL_ResizeEvent resize;
 SDL_ExposeEvent expose;
 SDL_QuitEvent quit;
 SDL_UserEvent user;
     SDL_SysWMEvent syswm;
} SDL_Event;

我无法理解的是,如何有一个“类型”成员与事件类型共存?因为它们占用相同的内存区域,所以它们不是一次只能存在一个吗?联合不会作为一种类型或其中一个事件随时存在吗?

我知道每个事件实际上是一个具有类型成员的结构,例如:

// SDL_MouseButtonEvent

typedef struct{
     Uint8 type;
     Uint8 button;
     Uint8 state;
     Uint16 x, y;
} SDL_MouseButtonEvent;

这有什么意义呢?这是否以某种方式允许联合的类型成员代表联合当前的任何结构的类型?当联合体中除一个成员之外的每个成员都是一个结构体并且每个结构体都包含该一个成员时,是否会发生某种奇怪的效果?

您可以在不知道对象是哪个结构的情况下访问结构成员吗?

Thanks!


如果每个事件类型都有一个Uint8作为其第一个数据成员,然后type的成员union只是一个方便。

联合的一般规则是,您只能使用写入的最后一个数据成员来访问联合中的数据。所以,如果您上次写信给active,您接下来无法读取key.

此规则的一个例外是,如果联合体的多个成员共享相同的前缀(如果它们的第一个数据成员相同),则您可以通过共享该前缀的联合体的任何数据成员访问该前缀。所以,这里你可以参考一下active.type or key.type,无论联合体的哪个数据成员处于活动状态,它都会起作用。

The type成员SDL_Event只是一个方便的快捷方式,可让您访问该内容type字段,而无需将其限定为event_object.active.type or event_object.key.type。你可以只使用event_object.type.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

包含“类型”成员的联合 的相关文章

随机推荐

  • 如何在窗口窗体中制作圆形标签?

    众所周知 标签通常是正方形或长方形 我真的需要制作圆形标签 谁能告诉我这是否可能 或者至少为我指出正确的方向 抱歉 只是为了把事情说清楚 我想要一个圆形标签 不仅仅是在屏幕上画一个圆圈 您可以设置 Label 的 Region 属性 var
  • 在 CentOS 6.4 中意外删除了符号链接 libc.so.6。如何获得 sudo 权限来重新创建它?

    我不小心删除了符号链接 lib64 libc so 6 gt lib64 libc 2 12 so sudo rm libc so 6 然后我不能使用任何东西 包括ls命令 我输入的任何命令都会出现错误 ls error while loa
  • 如何使用 USPS 验证给定地址?

    我想向 USPS 验证给定的地址 地址 城市 州 邮政编码 如果提供的地址是有效地址 则返回结果 如果不是有效地址 则返回无效地址 那么我怎样才能在 C Net 中做到这一点呢 美国邮政服务 USPS 通过其地址信息 API 提供此服务 U
  • 扁平按钮与凸起按钮

    我想知道之间的基本区别Flat button and Raised Button 根据新Android材料设计指南 我想使用凸起按钮 但我不知道它们是什么 网络上有一些论坛显示一个凸起的按钮 但他们称之为 扁平 谁能告诉我两者之间的基本区别
  • Android 找不到类异常

    我正在使用两个单独的类 其中一个有一些按钮 另一个打开谷歌地图 我正在其上进行覆盖 如果有人能看到我打开 Map class 的意图的问题 请告诉我 我将输入我的错误消息和代码 package com state park import j
  • ORM 是用于迁移数据的正确工具吗?

    背景 我们正在升级旧版导入工具 它的作用是将数据从连接到 SQL Server 的一个数据库移动到同一服务器上的第二个数据库 并使用不同的模式沿途执行转换和映射 这是一个帮助解释正在发生的事情的示例 假设源数据库有一张表名为Client I
  • Java - 点在线

    我如何找出点 x y 是否位于其他两个点之间创建的线上 我尝试了这个 但似乎有些问题 因为我没有得到我应该得到的结果 public boolean intersects Point k Point z Point p Line2D line
  • Jackson 或 JAXB,哪一个更适合 JSON? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想知道 JSON Jackson 或 JAXB 哪一个更好 我做了一些研究 我知道 也许我错了 我们不应该使用 JAXB 来转换 JSON 某
  • 比较当前月份和上个月的列上的行,SQL Server 2012

    我需要一些指导和帮助来解决我不完全确定如何在 SQL Server 2012 中解决的问题 我认为LAG and LEAD函数可能有用 但我不确定 这就是我的数据现在的样子 YearMonth LocationCode Active 201
  • 是否可以使用文件名模式创建 blob 触发的 azure 函数?

    我正在开发一个 blob 触发的 azure 函数 以下是我的 function json 文件的配置 disabled false bindings name myBlob type blobTrigger direction in pa
  • 如何在 CKEditor 中更改已注册的对话框

    我正在尝试编写一个插件 向图像对话框添加一个附加选项卡 页面 我不想更改对话框的源本身 而是使用插件来增强它 我搜索文档和论坛已经有一段时间了 现在我知道我可以在对话框对象上调用 addPage 来添加另一个选项卡 我也了解内容对象必须是什
  • 识别 Pandas 数据框中组中重复项的更好方法? [复制]

    这个问题在这里已经有答案了 我有一个数据框 x c 0 0 1 1 3 2 2 1 1 3 2 1 4 3 1 5 4 1 6 1 0 7 3 1 8 2 1 9 1 2 我想生产 c x duplicated 0 1 0 False 1
  • 如何交错或创建两个字符串的唯一排列(无需递归)

    问题是打印两个给定字符串的所有可能的交错 所以我用 Python 编写了一个工作代码 其运行如下 def inter arr1 arr2 p1 p2 arr thisarr copy arr if p1 len arr1 and p2 le
  • 如何动态更改母版页

    我想为一个纯aspx文件动态分配一个母版页 任何人都可以告诉我 如何做到这一点 您可以覆盖 default aspx cs 中的 OnPreInit 并根据查询字符串中的某些值设置母版页 像这样的事情 protected override
  • 什么是低位和高位?

    谁能告诉我什么是低位和高位 如何识别高位和低位 下面是二进制形式 如何0110里面有更高位吗 0110 0111 1100 1010 1100 0111 1001 1011 就像十进制一样 二进制中较高位通常写在左侧 所以如果你看到0111
  • pandas.concat 和 numpy.append 大数据集的内存错误

    我面临一个问题 我必须在循环中生成大型 DataFrame 每次两个 2000 x 800 pandas DataFrame 时进行 50 次迭代计算 我想将结果保存在内存中更大的 DataFrame 中 或者保存在类似字典的结构中 使用
  • 查找 Java Enum 的最佳实践

    我们有一个 REST API 客户端可以提供代表服务器上 Java 枚举中定义的值的参数 所以我们可以提供一个描述性错误 我们添加这个lookup每个枚举的方法 看起来我们只是在复制代码 不好 有更好的做法吗 public enum MyE
  • AWS - t2.micro 实例 EBS 卷大小

    我试图通过 AWS 控制台创建 t2 micro 实例 我希望它免费一年 但它不附带任何实例存储 所以我想在这个实例中添加 EBS 卷 免费吗 我可以在 t2 micro 中免费添加的最大 EBS 卷是多少 Model vCPU CPU C
  • 我应该使用全局变量在整个服务器上共享 socket.io 实例吗

    以下是我的 node js 应用程序中的 server js 文件 我希望我的 socket io 实例能够被服务器上的其他文件访问 以便从我的 API 发出事件 listingRoutesApi userRoutesApi etc ref
  • 包含“类型”成员的联合

    关于工会 我有一个关于我仍然不明白的问题 我读过它们的很多用途 并且大部分都可以看到它们如何有用并理解它们 我已经看到它们可以提供原始的 C 风格 多态性 我在几个网站上看到的例子是 SDL 的事件联盟 typedef union Uint