C語言已經(jīng)有幾十年的歷史了。經(jīng)過長(zhǎng)時(shí)間的發(fā)展和普及,C語言的應(yīng)用場(chǎng)景有了很大的變化,一些舊觀念應(yīng)該被淡化或者不再被推薦。
本書展現(xiàn)了傳統(tǒng)C語言教科書所不具有相關(guān)技術(shù)。全書分為開發(fā)環(huán)境和語言兩個(gè)部分,從編譯、調(diào)試、測(cè)試、打包、版本控制等角度,以及指針、語法、文本、結(jié)構(gòu)、面向?qū)ο缶幊、函?shù)庫(kù)等方面,對(duì)C程序設(shè)計(jì)的核心知識(shí)進(jìn)行查缺補(bǔ)漏和反思。本書鼓勵(lì)讀者放棄那些對(duì)大型機(jī)才有意義的舊習(xí)慣,拿起新的工具來使用這門與時(shí)俱進(jìn)的簡(jiǎn)潔語言。
本書適合有一定基礎(chǔ)的C程序員和C語言學(xué)習(xí)者閱讀,也適合想要深入理解C語言特性的讀者參考。
深入解析C語言特性,塑造編程新思維。通過獨(dú)辟蹊徑的C語言解說之道,展示C語言的編程技巧和優(yōu)勢(shì),帶領(lǐng)讀者發(fā)掘C的魅力,更好地利用C進(jìn)行程序設(shè)計(jì)與開發(fā)。本書適合普通程序員和高校計(jì)算機(jī)相關(guān)專業(yè)的學(xué)生閱讀,更適合對(duì)C情有獨(dú)鐘的人深度學(xué)習(xí)。
自從于加州理工學(xué)院獲得社會(huì)科學(xué)博士后,Ben Klemens就一直從事統(tǒng)計(jì)分析和人口的計(jì)算機(jī)輔助建模工作。他的觀點(diǎn)是,寫代碼一定應(yīng)該是趣味橫生的,并先后非常愉快地為布魯金斯學(xué)會(huì)、世界銀行、美國(guó)國(guó)家精神健康中心等機(jī)構(gòu)寫過分析和建模代碼(主要是C代碼)。他作為布魯金斯學(xué)會(huì)的非常駐研究員,與自由軟件基金會(huì)一道,做了很多工作來確保有創(chuàng)意的程序員擁有保留其作品使用權(quán)的權(quán)利。他目前為美國(guó)聯(lián)邦政府工作。
第 1部分 開發(fā)環(huán)境
第 1章 準(zhǔn)備方便的編譯環(huán)境 3
1.1 使用包管理工具 4
1.2 在Windows下編譯C程序 6
1.2.1 Windows中的POSIX環(huán)境 7
1.2.2 在POSIX環(huán)境中編譯C語言 8
1.2.3 在非POSIX環(huán)境中編譯C語言 9
1.3 鏈接函數(shù)庫(kù)的方式 10
1.3.1 一些我喜歡的選項(xiàng) 12
1.3.2 路徑 13
1.3.3 運(yùn)行時(shí)連接 16
1.4 使用makefile 16
1.4.1 設(shè)定變量 17
1.4.2 規(guī)則 20
1.5 以源文件的方式使用庫(kù) 24
1.6 以源文件的方式使用庫(kù)(即使你的系統(tǒng)管理員不想叫你這么做) 25
1.7 通過here來編譯C程序 27
1.7.1 在命令行里包含頭文件 27
1.7.2 統(tǒng)一的頭文件 28
1.7.3 here文檔 29
1.7.4 從stdin中編譯 30
第 2章 調(diào)試、測(cè)試和文檔 32
2.1 使用調(diào)試器 32
2.1.1 調(diào)試的偵探故事 34
2.1.2 GDB變量 43
2.1.3 打印結(jié)構(gòu) 45
2.2 利用Valgrind檢查錯(cuò)誤 49
2.3 單元測(cè)試 51
2.3.1 把程序用作庫(kù) 54
2.3.2 測(cè)試覆蓋 55
2.4 錯(cuò)誤檢查 56
2.4.1 在錯(cuò)誤中的用戶的角色? 56
2.4.2 用戶工作的上下文環(huán)境 58
2.4.3 如何返回錯(cuò)誤信息 60
2.5 編制文檔 60
2.5.1 Doxygen 61
2.5.2 用CWEB解釋代碼 62
第3章 打包項(xiàng)目 65
3.1 shell 66
3.1.1 用shell命令的輸出來替換命令 66
3.1.2 用shell的循環(huán)來處理一組文件 68
3.1.3 針對(duì)文件的測(cè)試 70
3.1.4 fc 73
3.2 makefile還是shell腳本 75
3.3 用Autotools打包代碼 77
3.3.1 一個(gè)Autotools的示例 79
3.3.2 用makefile.a(chǎn)m來描述makefile 82
3.3.3 配置腳本 87
第4章 版本控制 92
4.1 通過diff查看差異 93
4.2 Git的對(duì)象 94
4.3 樹和它們的分支 99
4.3.1 融合 100
4.3.2 遷移 102
4.4 遠(yuǎn)程版本庫(kù) 103
第5章 協(xié)助開發(fā) 106
5.1 動(dòng)態(tài)裝載 106
5.2 流程 109
5.2.1 為外來語言寫程序 110
5.2.2 包裝函數(shù) 110
5.2.3 跨越邊境的代理數(shù)據(jù)結(jié)構(gòu) 111
5.2.4 鏈接 112
5.3 與Python一起工作 113
5.3.1 編譯與連接 114
5.3.2 Automake的條件子目錄 114
5.3.3 Autotools支持下的Distutils 116
第 2部分 語言
第6章 玩轉(zhuǎn)指針 121
6.1 自動(dòng)、靜態(tài)和手工內(nèi)存 121
6.2 持久性的狀態(tài)變量 125
6.3 不使用malloc的指針 127
6.3.1 結(jié)構(gòu)被復(fù)制,數(shù)組創(chuàng)建別名 129
6.3.2 malloc和內(nèi)存操縱 132
6.3.3 錯(cuò)誤來源于星號(hào) 133
6.3.4 你需要知道的各種指針運(yùn)算 134
6.3.5 將typedef作為一種教學(xué)工具 137
第7章 教科書不應(yīng)該再過多介紹的C語言語法 139
7.1 不需要明確地從main函數(shù)返回 139
7.2 讓聲明的位置更靈活 140
7.3 減少類型轉(zhuǎn)換 143
7.4 枚舉和字符串 145
7.5 標(biāo)簽、goto、switch和break 147
7.5.1 探討goto 147
7.5.2 switch 150
7.6 被摒棄的float 151
7.7 比較無符號(hào)整型數(shù) 154
7.8 安全的將字符串解析成數(shù)字 154
第8章 那些C語言教科書經(jīng)常不講解的語法 158
8.1 營(yíng)造健壯和繁盛的宏 158
8.1.1 預(yù)處理器技巧 162
8.1.2 測(cè)試宏 166
8.1.3 避免頭文件重復(fù)包含 168
8.2 static和extern鏈接 170
8.3 const關(guān)鍵字 173
8.3.1 名詞-形容詞形式 174
8.3.2 壓力 175
8.3.3 深度 176
8.3.4 char const **問題 177
第9章 簡(jiǎn)單的文本處理 180
9.1 使用asprintf,使字符串的處理不再那么痛苦 180
9.1.1 安全 183
9.1.2 常量字符串 184
9.1.3 用asprintf擴(kuò)展字符串 185
9.1.4 strtok的贊歌 187
9.2 Unicode 192
9.2.1 C代碼的編碼 194
9.2.2 Unicode函數(shù)庫(kù) 195
9.2.3 示例代碼 196
第 10章 更好的結(jié)構(gòu) 200
10.1 復(fù)合常量 201
10.2 可變參數(shù)宏 202
10.3 安全終止的列表 204
10.4 多列表 205
10.5 Foreach 206
10.6 函數(shù)的向量化 207
10.7 指定的初始化器 209
10.8 用零初始化數(shù)組和結(jié)構(gòu) 211
10.9 typedef可以化繁為簡(jiǎn) 212
10.10 從函數(shù)返回多個(gè)數(shù)據(jù)項(xiàng) 214
10.11 靈活的函數(shù)輸入 218
10.11.1 把函數(shù)聲明為printf風(fēng)格 219
10.11.2 可選參數(shù)和命名參數(shù) 221
10.11.3 使無聊的函數(shù)煥發(fā)光彩 223
10.12 void指針以及它所指向的結(jié)構(gòu) 229
10.12.1 具有通用輸入的函數(shù) 229
10.12.2 通用結(jié)構(gòu) 234
第 11章 C語言面向?qū)ο缶幊?240
11.1 擴(kuò)展結(jié)構(gòu)和字典 241
11.1.1 實(shí)現(xiàn)一個(gè)字典 243
11.1.2 C,更少的縫隙 247
11.2 你結(jié)構(gòu)中的函數(shù) 253
11.3 作用域 261
11.4 用操作符重載進(jìn)行重載 264
11.5 引用計(jì)數(shù) 268
11.5.1 示例:一個(gè)子字符串對(duì)象 268
11.5.2 一個(gè)基于代理的組構(gòu)造模型 273
11.5.3 結(jié)論 280
第 12章 多線程 281
12.1 環(huán)境 282
12.2 OpenMP 283
12.2.1 編譯OpenMP、pthreads和C原子(atom) 286
12.2.2 沖突 287
12.2.3 映射縮減 288
12.2.4 多任務(wù) 289
12.3 線程本地 290
12.4 共享資源 292
12.5 pthread 299
12.6 C原子 304
第 13章 函數(shù)庫(kù) 311
13.1 GLib 311
13.2 POSIX 312
13.2.1 解析正則表達(dá)式 312
13.2.2 為巨大的數(shù)據(jù)集合使用mmap 317
13.3 GNU科學(xué)計(jì)算庫(kù) 320
13.4 SQLite 322
13.5 libxml和cURL 325
附錄A C101 329
后記 348
術(shù)語表 349