目录
前言 ..1
第I 部分 C 语言的模式
第1 章 错误处理 21
1.1 运行示例23
1.2 函数拆分24
1.3 守卫子句28
1.4 武士原则32
1.5 Goto 处理错误 36
1.6 清理记录40
1.7 基于对象的错误处理 ..43
1.8 总结 .48
1.9 进一步阅读 ..48
1.10 展望 ..49
第2 章 返回错误信息 ..51
2.1 运行示例53
2.2 返回状态码 ..54
2.3 返回相关错误 .62
2.4 特定返回值 ..69
2.5 错误日志73
2.6 总结 .80
2.7 进一步阅读 ..81
2.8 展望 .81
第3 章 内存管理 83
3.1 动态内存中的数据存储与问题 ..85
3.2 运行示例87
3.3 栈优先 88
3.4 永久内存92
3.5 懒清理 96
3.6 专属所有权 101
3.7 分配包装器 105
3.8 指针检查. 110
3.9 内存池 . 114
3.10 总结 121
3.11 进一步阅读 .121
3.12 展望 122
第4 章 从C 的函数中返回数据 . 123
4.1 运行示例.125
4.2 返回值 .126
4.3 输出参数.130
4.4 聚合实例.135
4.5 不可变实例 140
4.6 调用者自持缓冲区 .144
4.7 被调用者分配 ..149
4.8 总结 ..154
4.9 展望 ..154
第5 章 数据的生命周期及所有权 . 155
5.1 无状态的软件模块 .157
5.2 带有全局状态的软件模块 .162
5.3 调用者自持实例 .168
5.4 共享实例.174
5.5 总结 ..182
5.6 进一步阅读 182
5.7 展望 ..183
第6 章 灵活的API . 185
6.1 头文件 .187
6.2 句柄 ..191
6.3 动态接口.195
6.4 函数控制.199
6.5 总结 ..203
6.6 进一步阅读 204
6.7 展望 ..204
第7 章 灵活的迭代器接口 .. 205
7.1 运行示例.207
7.2 索引访问.208
7.3 游标迭代器 213
7.4 回调迭代器 218
7.5 总结 ..224
7.6 进一步阅读 225
7.7 展望 ..226
第8 章 在模块化程序中组织文件 . 227
8.1 运行示例.229
8.2 引用守卫.232
8.3 软件模块目录 ..235
8.4 全局引用目录 ..241
8.5 自包含组件 246
8.6 API 复制 .252
8.7 总结 ..262
8.8 展望 ..262
第9 章 逃离#ifdef 地狱 263
9.1 运行示例.265
9.2 避免变体.267
9.3 独立元函数 271
9.4 原子元函数 275
9.5 抽象层 .278
9.6 拆分变体实现 ..284
9.7 总结 ..291
9.8 进一步阅读 292
9.9 展望 ..292
第II 部分 模式故事
第10 章 实现日志功能 . 295
10.1 模式的故事 .295
10.1.1 文件组织 296
10.1.2 核心日志函数 ..297
10.1.3 日志源过滤器 ..299
10.1.4 条件日志记录 ..301
10.1.5 多个记录日志的地方 302
10.1.6 文件日志记录 ..304
10.1.7 跨平台文件305
10.1.8 使用日志记录器 .308
10.2 总结 309
第11 章 构建用户管理系统 311
11.1 模式的故事 . 311
11.1.1 数据组织 311
11.1.2 文件组织 313
11.1.3 认证:错误处理 .315
11.1.4 认证:错误日志 .317
11.1.5 添加用户:错误处理 318
11.1.6 迭代 ..321
11.1.7 使用用户管理系统 323
11.2 总结 324
第12 章 总结 .. 327
12.1 你学到的内容 327
12.2 进一步阅读 .327
12.3 结束语 ..328