回调函数(callbacks)是作为另一个函数的参数传递的函数地址。这使得实现事件处理程序、用户算法和插件成为可能。
回调函数的声明:
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 库的回调时在另一个操作系统上导致程序崩溃。