C語(yǔ)言已經(jīng)有幾十年的歷史了。經(jīng)過(guò)長(zhǎng)時(shí)間的發(fā)展和普及,C語(yǔ)言的應(yīng)用場(chǎng)景有了很大的變化,一些舊觀(guān)念應(yīng)該被淡化或者不再被推薦。
本書(shū)展現(xiàn)了傳統(tǒng)C語(yǔ)言教科書(shū)所不具有相關(guān)技術(shù)。全書(shū)分為開(kāi)發(fā)環(huán)境和語(yǔ)言?xún)蓚(gè)部分,從編譯、調(diào)試、測(cè)試、打包、版本控制等角度,以及指針、語(yǔ)法、文本、結(jié)構(gòu)、面向?qū)ο缶幊、函?shù)庫(kù)等方面,對(duì)C程序設(shè)計(jì)的核心知識(shí)進(jìn)行查缺補(bǔ)漏和反思。本書(shū)鼓勵(lì)讀者放棄那些對(duì)大型機(jī)才有意義的舊習(xí)慣,拿起新的工具來(lái)使用這門(mén)與時(shí)俱進(jìn)的簡(jiǎn)潔語(yǔ)言。
本書(shū)適合有一定基礎(chǔ)的C程序員和C語(yǔ)言學(xué)習(xí)者閱讀,也適合想要深入理解C語(yǔ)言特性的讀者參考。
深入解析C語(yǔ)言特性,塑造編程新思維。通過(guò)獨(dú)辟蹊徑的C語(yǔ)言解說(shuō)之道,展示C語(yǔ)言的編程技巧和優(yōu)勢(shì),帶領(lǐng)讀者發(fā)掘C的魅力,更好地利用C進(jìn)行程序設(shè)計(jì)與開(kāi)發(fā)。本書(shū)適合普通程序員和高校計(jì)算機(jī)相關(guān)專(zhuān)業(yè)的學(xué)生閱讀,更適合對(duì)C情有獨(dú)鐘的人深度學(xué)習(xí)。
自從于加州理工學(xué)院獲得社會(huì)科學(xué)博士后,Ben Klemens就一直從事統(tǒng)計(jì)分析和人口的計(jì)算機(jī)輔助建模工作。他的觀(guān)點(diǎn)是,寫(xiě)代碼一定應(yīng)該是趣味橫生的,并先后非常愉快地為布魯金斯學(xué)會(huì)、世界銀行、美國(guó)國(guó)家精神健康中心等機(jī)構(gòu)寫(xiě)過(guò)分析和建模代碼(主要是C代碼)。他作為布魯金斯學(xué)會(huì)的非常駐研究員,與自由軟件基金會(huì)一道,做了很多工作來(lái)確保有創(chuàng)意的程序員擁有保留其作品使用權(quán)的權(quán)利。他目前為美國(guó)聯(lián)邦政府工作。
第 1部分 開(kāi)發(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語(yǔ)言 8
1.2.3 在非POSIX環(huán)境中編譯C語(yǔ)言 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 通過(guò)here來(lái)編譯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ò)誤中的用戶(hù)的角色? 56
2.4.2 用戶(hù)工作的上下文環(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命令的輸出來(lái)替換命令 66
3.1.2 用shell的循環(huán)來(lái)處理一組文件 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來(lái)描述makefile 82
3.3.3 配置腳本 87
第4章 版本控制 92
4.1 通過(guò)diff查看差異 93
4.2 Git的對(duì)象 94
4.3 樹(shù)和它們的分支 99
4.3.1 融合 100
4.3.2 遷移 102
4.4 遠(yuǎn)程版本庫(kù) 103
第5章 協(xié)助開(kāi)發(fā) 106
5.1 動(dòng)態(tài)裝載 106
5.2 流程 109
5.2.1 為外來(lái)語(yǔ)言寫(xiě)程序 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部分 語(yǔ)言
第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ò)誤來(lái)源于星號(hào) 133
6.3.4 你需要知道的各種指針運(yùn)算 134
6.3.5 將typedef作為一種教學(xué)工具 137
第7章 教科書(shū)不應(yīng)該再過(guò)多介紹的C語(yǔ)言語(yǔ)法 139
7.1 不需要明確地從main函數(shù)返回 139
7.2 讓聲明的位置更靈活 140
7.3 減少類(lèi)型轉(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 比較無(wú)符號(hào)整型數(shù) 154
7.8 安全的將字符串解析成數(shù)字 154
第8章 那些C語(yǔ)言教科書(shū)經(jīng)常不講解的語(yǔ)法 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 **問(wèn)題 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 使無(wú)聊的函數(shù)煥發(fā)光彩 223
10.12 void指針以及它所指向的結(jié)構(gòu) 229
10.12.1 具有通用輸入的函數(shù) 229
10.12.2 通用結(jié)構(gòu) 234
第 11章 C語(yǔ)言面向?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章 多線(xiàn)程 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 線(xiàn)程本地 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ù)語(yǔ)表 349