回调函数 定义:回调函数是一种将函数作为参数传递给另一个函数,并在特定时机由该函数主动调用的机制。 核心特性: 函数指针支持 动态行为绑定 解耦调用者与被调用者 应用场景: 事件驱动编程(如GUI事件处理) 异步操作通知 […]
- 回调函数
- 定义:回调函数是一种将函数作为参数传递给另一个函数,并在特定时机由该函数主动调用的机制。
- 核心特性:
- 函数指针支持
- 动态行为绑定
- 解耦调用者与被调用者
- 应用场景:
- 事件驱动编程(如GUI事件处理)
- 异步操作通知(如I/O完成回调)
- 排序算法自定义比较器(如qsort())
- 经典案例:
#include <stdio.h>void process(int value, void (*callback)(int)) { printf("Processing %d\n", value); callback(value); // 回调执行}void logResult(int x) { printf("Result: %d\n", x*x);}int main() { process(5, logResult); // 传递logResult作为回调 return 0;}
- 注意事项:
- 确保函数签名匹配
- 管理回调函数生命周期
- 跨线程回调需同步保护
- C语言MD5加密实现
- 算法原理:
- 消息摘要长度固定128位
- 分块处理(每块512位)
- 四轮迭代运算
- 最终输出16字节哈希值
- VS2013开发环境配置:
- 集成OpenSSL库:
- 下载Win32版OpenSSL
- 添加include路径:openssl\include
- 链接libeay32.lib
- 复制dll到调试目录
- 代码实现:
#include <openssl/md5.h>void ComputeMD5(const char *input, unsigned char digest[MD5_DIGEST_LENGTH]) { MD5_CTX ctx; MD5_Init(&ctx); MD5_Update(&ctx, input, strlen(input)); MD5_Final(digest, &ctx);}int main() { const char *text = "Hello World"; unsigned char hash[MD5_DIGEST_LENGTH]; ComputeMD5(text, hash); for(int i=0; i
- 替代方案:
- Windows CryptoAPI (CryptCreateHash)
- 纯C手动实现(推荐学习用途)
- 集成OpenSSL库:
- 综合应用示例
- 文件校验工具:
#include <stdio.h>#include <openssl/md5.h>void FileMD5(const char *filename, unsigned char digest[MD5_DIGEST_LENGTH]) { FILE *file = fopen(filename, "rb"); if (!file) return; MD5_CTX ctx; MD5_Init(&ctx); const int bufSize = 4096; unsigned char buffer[bufSize]; size_t bytesRead; while ((bytesRead = fread(buffer, 1, bufSize, file)) > 0) MD5_Update(&ctx, buffer, bytesRead); MD5_Final(digest, &ctx); fclose(file);}int main() { unsigned char hash[MD5_DIGEST_LENGTH]; FileMD5("test.txt", hash); // 输出验证结果... return 0;}
- 回调结合案例:
typedef void (*ProgressCallback)(double percent);void EncryptFileAsync(const char *inputPath, ProgressCallback onProgress) { // 异步加密逻辑 for(int i=0; i<=100; i+=10) { Sleep(100); // 模拟耗时操作 if (onProgress) onProgress(i); // 回调进度 }}int main() { EncryptFileAsync("data.txt", [](double p){ printf("%.0f%% complete\n", p); }); return 0;}
- 性能优化技巧
- 回调优化:
- 避免深层嵌套回调
- 使用状态机代替回调链
- 关键路径内联化
- MD5加速:
- 利用SSE指令集优化
- 批量处理数据块
- 缓存友好内存布局
- 常见问题解答
- Q:VS编译报错LNK2019 unresolved symbol?
- A:检查lib路径是否正确,确认项目配置为32/64位对应版本
- Q:回调函数导致程序崩溃?
- A:检查函数指针有效性,确保回调函数未超出作用域
- Q:MD5输出不一致?
- A:确认编码方式(ASCII/UTF-8),检查末尾空字符
- 未来趋势
- 后量子加密研究
- 零知识证明技术发展
- 异步编程模型演进