null
vuild_
Nodes
Flows
Hubs
Login
MENU
Notifications
Login
☆ Star
Callback Pattern
#c
#c-lang
#advanced
#design-patterns
#callback
@devpc
|
2026-03-29 13:49:35
|
GET /api/v1/nodes/86?nv=1
History:
v1 (2026-03-29) (Latest)
0
Views
0
Calls
# Callback Pattern > 이벤트 핸들러, 콜백 등록·호출 구조 설계 ## 학습 목표 - 콜백 함수의 개념과 등록·호출 흐름을 이해한다 - 이벤트 핸들러 시스템을 직접 설계하고 구현한다 - `void *userdata`를 통한 컨텍스트 전달 패턴을 익힌다 ## 내용 ### 기본 콜백 구조 ```c // 콜백 타입 정의 typedef void (*EventCallback)(int event_type, void *userdata); // 콜백을 받아 실행하는 함수 void trigger_event(int event_type, EventCallback cb, void *userdata) { printf("[이벤트 발생] type=%d\n", event_type); if (cb) cb(event_type, userdata); } // 콜백 구현 void my_handler(int event_type, void *userdata) { char *msg = (char *)userdata; printf("핸들러 실행: event=%d, msg=%s\n", event_type, msg); } int main() { char *ctx = "Hello from context"; trigger_event(1, my_handler, ctx); return 0; } ``` ### 이벤트 핸들러 등록 시스템 ```c #define MAX_HANDLERS 8 typedef struct { EventCallback cb; void *userdata; } Handler; typedef struct { Handler handlers[MAX_HANDLERS]; int count; } EventBus; // 핸들러 등록 int event_bus_on(EventBus *bus, EventCallback cb, void *userdata) { if (bus->count >= MAX_HANDLERS) return -1; bus->handlers[bus->count].cb = cb; bus->handlers[bus->count].userdata = userdata; bus->count++; return 0; } // 이벤트 발행 (등록된 모든 핸들러 호출) void event_bus_emit(EventBus *bus, int event_type) { for (int i = 0; i < bus->count; i++) bus->handlers[i].cb(event_type, bus->handlers[i].userdata); } ``` ### 활용 예시 ```c int main() { EventBus bus = { .count = 0 }; int ctx_a = 100, ctx_b = 200; event_bus_on(&bus, my_handler, &ctx_a); event_bus_on(&bus, my_handler, &ctx_b); event_bus_emit(&bus, 42); // 두 핸들러 모두 호출 return 0; } ``` ## 참고 - `userdata`(또는 `context`) 포인터 패턴은 C 라이브러리 설계의 핵심 관용구다 - libuv, GTK, SDL 등 대부분의 C 이벤트 시스템이 이 구조를 따른다
// COMMENTS
ON THIS PAGE