gpt4 book ai didi

c - 同时访问一个 c union 的不同成员

转载 作者:行者123 更新时间:2023-12-04 12:15:01 32 4
gpt4 key购买 nike

我遇到过一段代码,它似乎同时使用 union 体的不同成员:

XEvent ev;

if(handler[ev.type])
(handler[ev.type])(&ev);

Handler 是一个函数数组。下面是 XEvent 的定义:

typedef union _XEvent{
int type;/*must not be changed*/
XAnyEvent xany;
XKeyEvent xkey;
XButtonEvent xbutton;
............
} Xevent;

XEvent 的所有结构成员都有一个 int 作为第一个成员。被调用函数使用 XEvent 的适当成员结构。

void
kpress(XEvent *ev) {
XKeyEvent *e = &ev->xkey;

问题是 XKeyEvent 似乎也使用其第一个 int 成员的值来确定事件是按键按下还是按键释放。

typedef struct {
int type; /* KeyPress or KeyRelease */
unsigned long serial; /* # of last request processed by server */
.............
} XKeyEvent;

我在这里错过了什么?

注意:以上代码属于simple terminal,一个终端模拟器。并且所有提到的数据结构都属于Xlib。

最佳答案

我花了一段时间才明白你认为你的问题在哪里 - 因为实际上,没有...

您似乎假设事件类型整数和 union 中有效的结构之间必须存在 1:1 的关系。不,没有。

Xlib 所做的是:它将为 KeyPress 和 KeyRelease 事件放置相同的 XKeyEvent 结构(它们使用相同的数据成员,因此可用于两种事件情况)。

X11 窗口系统将 XEvent 作为不透明结构(或 OOP 术语“基类”)发送,接收者可以转换为原始结构(或在 OOP 中术语“派生类”)根据事件类型。重叠的 int 成员“type”用作类型选择器。

这样做是为了能够将通用代码中的事件“路由”到正确的位置,而不必处理每种事件类型。只有感兴趣的一方(实际接收者)会将内部 union 转换为正确的类型并“提取”它感兴趣的数据成员。

关于c - 同时访问一个 c union 的不同成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41721054/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com