나는 동시에 다른 회원들에게 노동 조합을 사용하는 것 같다 코드의 조각을 발견했습니다액세스 다른 회원 동시에
XEvent ev;
if(handler[ev.type])
(handler[ev.type])(&ev);
핸들러 함수의 배열입니다. 다음은 XEvent의 정의입니다.
typedef union _XEvent{
int type;/*must not be changed*/
XAnyEvent xany;
XKeyEvent xkey;
XButtonEvent xbutton;
............
} Xevent;
XEvent의 모든 struct 멤버에는 첫 번째 멤버가 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;
무엇이 여기에 있습니까?
참고 : 위의 코드는 간단한 터미널 인 터미널 에뮬레이터에 속합니다. 그리고 언급 된 모든 데이터 구조는 Xlib에 속합니다.
'int'(원래 '유니온'에 있음) with-an-initial-int는 "안전하다"(아마 추측 할 수 있겠지만, 아마도 "작동한다"). 그러면 XKeyEvent의 _reading_에 문제가 보이지 않는다. (아마도'KeyPress' 와'KeyRelease'는'XEvent'가 처리하는 더 넓은 이벤트 유형 중 두 가지입니다. 아마도'struct {int type; 노조 {....}}'. – TripeHound
@TripeHound : 다음에는 두 개의'type'이 있습니다. 하나는 외부 구조체이고 다른 하나는'union'의 다른 형식 앞에옵니다. 목표가 어떤 'X * Event'가 저장되었는지에 관계없이 'type'을 읽을 수있게하는 것 같습니다. – ShadowRanger
@shadowranger가 정확히 요점입니다 - X11 시스템은 이벤트를 불투명 한 구조로 보냅니다. 누군가가 거기에 무엇이 있는지 알고 싶다면, 그는'type' 멤버를 체크하고 실제 데이터 멤버에 접근하기 위해 유니온을 캐스트 할 수 있습니다. 그것은 일종의 "OOP in C"입니다. – tofro