注冊 | 登錄讀書好,好讀書,讀好書!
讀書網(wǎng)-DuShu.com
當(dāng)前位置: 首頁出版圖書科學(xué)技術(shù)計算機(jī)/網(wǎng)絡(luò)軟件與程序設(shè)計C語言最佳實踐

C語言最佳實踐

C語言最佳實踐

定 價:¥99.80

作 者: 魏永明
出版社: 人民郵電出版社
叢編項:
標(biāo) 簽: 暫缺

ISBN: 9787115645142 出版時間: 2025-01-01 包裝: 平裝-膠訂
開本: 16開 頁數(shù): 字?jǐn)?shù):  

內(nèi)容簡介

  本書是魏永明近30年來開發(fā)和維護(hù)MiniGUI、HVML等開源項目的經(jīng)驗總結(jié),旨在幫助有一定C程序編寫經(jīng)驗的軟件工程師在短時間內(nèi)有效提高設(shè)計能力和編碼水平。全書分為?3?篇。基礎(chǔ)篇從可讀性和可維護(hù)性出發(fā),闡述了如何提高代碼的可讀性、用好寫好頭文件、正確理解編譯警告并消除潛在問題、定義和使用常量等,介紹了如何有效利用構(gòu)建系統(tǒng)生成器(CMake)來維護(hù)項目;模式篇闡述了常見的C程序接口設(shè)計模式,說明了如何在C程序中解耦代碼和數(shù)據(jù)、利用子驅(qū)動程序?qū)崿F(xiàn)模型、設(shè)計可加載模塊等,介紹了狀態(tài)機(jī)的概念以及在C程序中如何利用狀態(tài)機(jī)實現(xiàn)分詞器、解析器等;質(zhì)量篇從性能和單元測試出發(fā),闡述了如何在C程序中避免編寫低效代碼、進(jìn)行單元測試、使用常見的單元測試框架等,介紹了高效調(diào)試C程序的若干技巧和工具。本書適合從事系統(tǒng)軟件、嵌入式或物聯(lián)網(wǎng)開發(fā)的C程序員、計算機(jī)相關(guān)專業(yè)高年級本科生和研究生閱讀。

作者簡介

  魏永明,獲清華大學(xué)工學(xué)學(xué)士、碩士學(xué)位,飛漫軟件創(chuàng)始人,2013年度“開源軟件杰出貢獻(xiàn)人物”,2023年世界開源軟件Top100貢獻(xiàn)榜人物。1999年發(fā)布了開源軟件MiniGUI并持續(xù)研發(fā)至今。編(譯)著有《MiniGUI剖析》、《Linux 實用教程》、《Linux 設(shè)備驅(qū)動程序》(二、三版)等技術(shù)著作。2018年11月,發(fā)起合璧操作系統(tǒng)開源協(xié)作項目;2020年8月,提出首款描述式編程語言HVML;2022年7月,開源發(fā)布 HVML 解釋器及渲染器。

圖書目錄

第 一篇 基礎(chǔ)篇

第 1章 提高代碼可讀性 3
1.1 代碼可讀性的級別 3
1.2 壞代碼的特點 4
1.2.1 壞代碼實例 5
1.2.2 妙手理碼 7
1.3 編碼風(fēng)格的內(nèi)容 9
1.3.1 Linux內(nèi)核編碼風(fēng)格的一些規(guī)定 10
1.3.2 其他常見的編碼風(fēng)格 11
1.4 提高代碼可讀性的最佳實踐 14
1.4.1 守好“80列”這條紅線 14
1.4.2 空格、大括號位置及縮進(jìn) 15
1.4.3 指針聲明和定義中的星號位置 16
1.4.4 善用類型定義 16
1.4.5 命名規(guī)則保持一致 19
1.4.6 正確書寫注釋 20
1.4.7 優(yōu)雅編寫條件編譯代碼 21
1.5 其他有關(guān)編碼風(fēng)格的最佳實踐 23
1.5.1 下畫線前綴的使用 24
1.5.2 錯誤處理及集中返回 24
1.5.3 參數(shù)的合法性檢查 28
1.6 命名的藝術(shù) 32
1.7 實例分析 34
1.7.1 PurC函數(shù)庫頭文件 34
1.7.2 經(jīng)典的list_head結(jié)構(gòu)體及其接口 37

第 2章 用好寫好頭文件 40
2.1 重新認(rèn)識頭文件 40
2.1.1 頭文件的作用 40
2.1.2 頭文件的分類 42
2.1.3 頭文件機(jī)制的復(fù)雜性 47
2.2 濫用系統(tǒng)頭文件的負(fù)面影響 61
2.3 自定義頭文件中的常見問題 62
2.3.1 不使用或不當(dāng)定義頭文件保衛(wèi)宏 62
2.3.2 未正確處理和C 程序混用的情形 63
2.3.3 未處理可能的重復(fù)定義 65
2.3.4 包含不該出現(xiàn)在頭文件中的內(nèi)容 66
2.3.5 未妥善處理可能的可移植性問題 68
2.4 頭文件相關(guān)的最佳實踐 70
2.4.1 兩大原則 70
2.4.2 頭文件的劃分及典型內(nèi)容 71
2.4.3 頭文件的組織 77

第3章 消除編譯警告 83
3.1 為什么不能忽視編譯警告 83
3.1.1 潛在問題恐釀成大禍 83
3.1.2 解讀編譯警告 84
3.2 常見的編譯警告及其分類 88
3.2.1 預(yù)處理警告 88
3.2.2 未使用警告 90
3.2.3 未初始化警告 93
3.2.4 類型安全警告 95
3.2.5 邏輯運算相關(guān)的警告 99
3.2.6 格式化相關(guān)警告 102
3.2.7 詞法警告 105
3.2.8 其他警告 109
3.3 編譯警告和函數(shù)屬性 110
3.3.1 malloc屬性 111
3.3.2 nonnull屬性 111
3.3.3 warn_unused_result屬性 112
3.3.4 format屬性 112
3.3.5 其他函數(shù)屬性 113
3.4 消除編譯警告只是開始 114

第4章 常量的定義和使用 116
4.1 常見的常量使用問題 116
4.1.1 立即數(shù)常量 116
4.1.2 字符串常量 119
4.2 正確定義和使用常量 121
4.2.1 立即數(shù)常量 121
4.2.2 字符串常量 127
4.3 優(yōu)雅定義和使用常量 127
4.3.1 借助編譯器 127
4.3.2 使用宏生成常量和代碼 130
4.3.3 巧用編譯時斷言 131
4.4 字符串的原子化 133

第5章 充分利用構(gòu)建系統(tǒng)生成器 136
5.1 常用構(gòu)建系統(tǒng)和構(gòu)建系統(tǒng)生成器 136
5.2 CMake影響編碼的選項或功能 138
5.2.1 構(gòu)建類型 138
5.2.2 處理平臺差異 139
5.2.3 自動生成代碼 142
5.3 CMake構(gòu)建體系模板 143
5.3.1 整體結(jié)構(gòu)和復(fù)制步驟 143
5.3.2 多平臺支持 149
5.3.3 檢測系統(tǒng)頭文件、函數(shù)或結(jié)構(gòu)體成員 150
5.3.4 查找第三方軟件包 151
5.3.5 自定義功能測試 152

第二篇 模式篇

第6章 接口設(shè)計模式 155
6.1 何謂好接口 155
6.2 兩個接口設(shè)計原則 157
6.3 一般性方法和技巧 161
6.3.1 完備性的保證 161
6.3.2 參數(shù)及返回值 162
6.4 模式1:抽象數(shù)據(jù)類型 164
6.4.1 范例1:變體 166
6.4.2 范例2:讀寫流 169
6.4.3 范例3:描述符或句柄 173
6.5 模式2:抽象算法 174
6.5.1 范例1:標(biāo)準(zhǔn)C庫的
qsort()函數(shù)及其擴(kuò)展 177
6.5.2 范例2:MiniGUI的曲線生成器函數(shù) 179
6.6 模式3:上下文 181
6.6.1 顯式上下文 181
6.6.2 隱式上下文 183
6.6.3 范例1:標(biāo)準(zhǔn)C庫的錯誤碼 184
6.6.4 范例2:PurC實例 185
6.7 模式4:事件驅(qū)動 186
6.7.1 范例1:MiniGUI消息驅(qū)動接口 187
6.7.2 范例2:glib的事件驅(qū)動接口 196
6.7.3 事件處理器的粒度 199
6.8 模式5:通用數(shù)據(jù)結(jié)構(gòu) 202
6.8.1 范例1:在節(jié)點結(jié)構(gòu)體中保留用戶數(shù)據(jù)成員 202
6.8.2 范例2:在用戶結(jié)構(gòu)體中包含通用節(jié)點結(jié)構(gòu)體 204
6.9 模式6:同類聚合 209
6.9.1 范例1:STDIO接口中的同類聚合 210
6.9.2 范例2:MiniGUI中圖片裝載接口的同類聚合 212
6.9.3 范例3:PurC變體接口中的同類聚合 212
6.9.4 避免過度設(shè)計 214
6.10 模式7:遍歷和迭代 215
6.10.1 方法1:遍歷宏 215
6.10.2 方法2:遍歷回調(diào) 218
6.10.3 方法3:迭代器 220
6.11 模式8:接口的擴(kuò)展和兼容性 222
6.11.1 方法1:新舊接口共存 222
6.11.2 方法2:舊接口只是新接口的繞轉(zhuǎn)接口 224
6.11.3 方法3:強制使用新接口,將舊接口標(biāo)記為廢棄或移除 225
6.11.4 方法4:預(yù)留擴(kuò)展能力 225
6.11.5 擴(kuò)展接口需要考慮的因素 229
6.12 綜合范例:PurC中的有序數(shù)組 229

第7章 解耦代碼和數(shù)據(jù) 233
7.1 解耦代碼和數(shù)據(jù)的重要性 233
7.2 一個簡單的例子 235
7.2.1 數(shù)據(jù)和代碼耦合的版本 235
7.2.2 數(shù)據(jù)和代碼解耦的版本 236
7.3 再來一個例子 238
7.4 更復(fù)雜的例子 241
7.4.1 最初的實現(xiàn) 243
7.4.2 改進(jìn)的版本 245
7.4.3 進(jìn)一步優(yōu)化 247
7.5 自動生成代碼 249
7.5.1 使用宏生成代碼 249
7.5.2 使用程序生成代碼 251

第8章 子驅(qū)動程序?qū)崿F(xiàn)模型 256
8.1 抽象的重要性 256
8.2 隨處可見的子驅(qū)動程序?qū)崿F(xiàn)模型 257
8.3 子驅(qū)動程序?qū)崿F(xiàn)模型的構(gòu)成 258
8.3.1 子驅(qū)動程序上下文結(jié)構(gòu)體指針 259
8.3.2 子驅(qū)動程序操作集 260
8.3.3 普通文件流對象的子驅(qū)動程序?qū)崿F(xiàn) 261
8.3.4 內(nèi)存緩沖區(qū)流對象的子驅(qū)動程序?qū)崿F(xiàn) 262
8.3.5 進(jìn)一步思考 264
8.4 正確區(qū)分機(jī)制和策略 265
8.5 子驅(qū)動程序?qū)崿F(xiàn)模型的演進(jìn) 266
8.5.1 最初的設(shè)計和實現(xiàn) 266
8.5.2 反思一:子驅(qū)動程序操作集的定義是否足夠完備和靈活 269
8.5.3 反思二:子驅(qū)動程序的實現(xiàn)中是否含有不該有的策略 271
8.5.4 反思三:還有哪些可以改進(jìn)的地方 273

第9章 動態(tài)加載模塊 275
9.1 可加載模塊的好處 275
9.2 軟件棧和可加載模塊的設(shè)計原則 275
9.3 可加載模塊的實現(xiàn)原理和要點 278
9.3.1 可加載模塊的底層機(jī)制 278
9.3.2 可加載模塊新舊版本的兼容性 278
9.3.3 可加載模塊的實現(xiàn)要點 280
9.4 使用可加載模塊支持新的圖片格式 281
9.5 重用已有子驅(qū)動程序的實現(xiàn) 285
9.5.1 合成器操作集 286
9.5.2 合成器相關(guān)的應(yīng)用程序接口 287
9.5.3 派生一個自己的合成器 288
9.5.4 裝載模塊定義的默認(rèn)合成器 289

第 10章 狀態(tài)機(jī) 292
10.1 狀態(tài)機(jī)的概念 292
10.2 定義一個狀態(tài)機(jī) 293
10.3 正確理解狀態(tài)機(jī) 295
10.4 狀態(tài)機(jī)在各類解析器中的應(yīng)用 297
10.4.1 簡單示例:判斷C語言立即數(shù)的進(jìn)制 297
10.4.2 復(fù)雜示例:HTML解析器中的分詞器 299

第三篇 質(zhì)量篇

第 11章 為性能編碼 309
11.1 何謂“性能” 309
11.2 提高性能的3個基本原則 312
11.2.1 不要做無用功 312
11.2.2 殺雞莫用牛刀 314
11.2.3 避免濫用內(nèi)存分配 315
11.3 實例研究:字符串匹配 318
11.3.1 最直接的實現(xiàn) 319
11.3.2 利用哈希算法進(jìn)行優(yōu)化 320
11.3.3 字符串的原子化 326
11.4 實例研究:如何判斷一個自然數(shù)是不是素數(shù) 331
11.4.1 小于16的自然數(shù) 331
11.4.2 可表示為無符號短整型的自然數(shù) 332
11.4.3 可表示為64位無符號長整型的自然數(shù) 334
11.5 實例研究:像素混合的并行計算 335
11.6 實例研究:達(dá)夫設(shè)備 338

第 12章 單元測試 340
12.1 單元測試的基本概念和重要性 340
12.2 單元測試的基本方法 341
12.2.1 單元測試可以無處不在 341
12.2.2 單元測試方法和測試用例的選擇 342
12.2.3 單元測試的自動化 348
12.3 單元測試框架 354
12.3.1 GLib Testing 354
12.3.2 GoogleTest 357
12.3.3 CTest 358
12.4 實例研究:HVML MATH對象的eval方法 359
12.4.1 測試目標(biāo) 359
12.4.2 測試方法 360
12.4.3 使用現(xiàn)有可信賴的工具生成預(yù)期結(jié)果 362

第 13章 高效調(diào)試 364
13.1 高效調(diào)試的基本原則 364
13.2 C程序常見錯誤分類 365
13.2.1 編譯、鏈接錯誤 365
13.2.2 疑難雜癥 366
13.3 內(nèi)存使用錯誤 367
13.3.1 靜態(tài)數(shù)據(jù)使用錯誤 367
13.3.2 堆使用錯誤 372
13.3.3 棧使用錯誤 379
13.4 內(nèi)存診斷工具 381
13.4.1 Efence 381
13.4.2 ASAN 384
13.4.3 Valgrind 386
13.5 日志 391

后記 396

本目錄推薦

掃描二維碼
Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號