콜백 함수는 다른 함수의 인수로서 전달되는 함수의 주소입니다. 이를 통해 이벤트 핸들러, 사용자 알고리즘 및 플러그인을 구현할 수 있습니다.
콜백 함수 선언:
typedef void (*callback_func_t)(int);
void process(callback_func_t cb) { // ... cb(42); // 콜백 호출 } void handler(int n) { printf("처리된 숫자: %d ", n); } int main() { process(handler); return 0; }
팁:
식별자가 일치하지 않는 시그니처의 함수를 콜백으로 전달할 수 있습니까?
자주 있는 잘못된 답변: "예, C는 명시적인 형 변환을 선언하면 허용합니다."
올바른 답변: 형식적 형 변환이 가능하긴 하지만, 그러한 함수를 호출하면 정의되지 않은 동작이 발생할 수 있습니다. 매개변수에 잘못된 값이 전달되고 스택이 손상될 수 있습니다.
위험 예:
typedef void (*cb_t)(int); void wrong_cb(double d) { printf("%f ", d); } void call(cb_t f) { f(123); } int main() { call((cb_t)wrong_cb); } // 위험: 시그니처가 다릅니다.
이야기
이야기
이야기
크로스 플랫폼 시스템을 개발할 때 작성자는 콜백 함수에 대한 호출 규칙을 잘못 정의했습니다. 이는 한 운영 체제에서는 문제가 발생하지 않았으나, 다른 운영 체제에서 C 라이브러리로부터 콜백을 호출할 때 프로그램이 크래시 되는 결과를 초래했습니다.