第一部分 开发环境 3
第1章 准备方便的编译环境 3
1.1 使用包管理器 4
1.2 在Windows下编译C 6
1.2.1 Windows中的POSIX环境 7
1.2.2 在POSIX下编译C 8
1.2.3 不在POSIX环境中编译C 9
1.3 库的路径 10
1.3.1 一些我喜欢的选项 11
1.3.2 路径 13
1.3.3 运行时连接 15
1.4 使用Makefile 16
1.4.1 设定变量 17
1.4.2 规则 19
1.5 以源文件利用库 23
1.6 以源文件利用库(即使你的系统管理员不想叫你这么做) 24
1.7 通过本地文档来编译C程序 26
1.7.1 在命令行里包含头文件 26
1.7.2 统一的头文件 27
1.7.3 嵌入文档 28
1.7.4 从stdin中编译 29
第2章 调试、测试和文档 31
2.1 使用调试器 31
2.1.1 GDB变量 35
2.1.2 打印结构 36
2.2 利用Valgrind检查错误 40
2.3 单元测试 41
2.3.1 把程序用作库 44
2.3.2 测试覆盖 45
2.4 编制文档 46
2.4.1 Doxygen 46
2.4.2 用CWEB解释代码 48
2.5 错误检查 50
2.5.1 在错误中的用户参与是什么 50
2.5.2 用户工作的上下文环境 52
2.5.3 如何返回错误信息 53
第3章 打包项目 55
3.1 shell 56
3.1.1 用shell命令的输出来替换命令 56
3.1.2 用shell的循环来处理一组文件 58
3.1.3 针对文件的测试 60
3.1.4 fc 62
3.2 makefile还是shell脚本 64
3.3 用Autotools打包代码 67
3.3.1 一个Autotools的示例 68
3.3.2 用makefile.am来描述makefile 71
3.3.3 配置脚本 76
第4章 版本控制 80
4.1 通过diff查看差异 81
4.2 Git的对象 82
4.3 树和它们的枝 86
4.3.1 融合 88
4.3.2 迁移 89
4.4 远程版本库 90
第5章 和谐共处 93
5.1 过程 93
5.1.1 作为外来语言写程序 93
5.1.2 包装函数 94
5.1.3 跨越边境的代理数据结构 94
5.1.4 连接 96
5.2 与Python一起工作 96
5.2.1 编译与连接 98
5.2.2 Automake的条件子目录 98
5.2.3 Autotools支持下的Distutils 100
第二部分 语言 105
第6章 玩转指针 105
6.1 自动、静态和手工内存 105
6.2 持久性的状态变量 108
6.3 不使用malloc的指针 109
6.3.1 结构被复制,数组创建别名 110
6.3.2 malloc和内存操纵 113
6.3.3 错误来源于星号 114
6.3.4 你需要知道的各种指针运算 115
第7章 可以忽略的C语法 120
7.1 不需要明确地从main函数返回 121
7.2 让声明流动 121
在运行时设置数组的长度 123
7.3 减少类型转换 124
7.4 枚举和字符串 125
7.5 标签、goto、switch和break 127
7.5.1 考虑goto 128
7.5.2 switch 129
7.6 被摒弃的float 131
第8章 障碍和机遇 135
8.1 营造健壮和繁盛的宏 135
预处理器技巧 139
8.2 static和extern链接 142
只在头文件中声明外部链接的元素 144
8.3 const关键字 146
8.3.1 名词-形容词形式 147
8.3.2 压力 148
8.3.3 深度 149
8.3.4 char const**问题 149
第9章 文本 153
9.1 使用asprintf,使字符串的处理不再痛苦 153
9.1.1 安全 155
9.1.2 常量字符串 155
9.1.3 用asprintf扩展字符串 157
9.1.4 strtok的赞歌 158
9.2 Unicode 162
9.2.1 C代码的编码 164
9.2.2 Unicode函数库 166
9.2.3 示例代码 167
第10章 更好的结构 170
10.1 复合文字 171
通过复合文字进行初始化 172
10.2 可变参数宏 172
10.3 安全终止的列表 174
10.4 Foreach 175
10.5 函数的向量化 175
10.6 指定的初始化值 177
10.7 用零初始化数组和结构 179
10.8 typedef可以化繁为简 180
10.9 从函数返回多个数据项 182
10.10 灵活的函数输入 186
10.10.1 把函数声明为printf风格 186
10.10.2 可选参数和命名参数 188
10.10.3 使无聊的函数焕发光彩 190
10.11 void指针以及它所指向的结构 196
10.11.1 具有通用输入的函数 196
10.11.2 通用结构 200
第11章 C语言的面向对象编程 205
11.1 你所不明白的(以及为什么你不能不明白) 206
11.1.1 作用域 206
11.1.2 用操作符重载进行重载 209
11.2 扩展结构和字典 213
11.2.1 扩展一个结构 214
11.2.2 实现一个字典 218
11.2.3 基于指向对象的指针编码 222
11.3 你结构中的函数 223
11.4 引用计数 227
11.4.1 示例:一个子字符串对象 228
11.4.2 一个基于代理的组构造模型 232
第12章 库 239
12.1 GLib 239
12.2 POSIX 240
12.2.1 为巨大的数据集合使用mmap 240
12.2.2 用Pthreads轻松实现线程 242
12.3 GNU科学计算库 250
12.4 SQLite 253
12.5 libxml和cURL 255
后记 260
术语表 261