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

C語(yǔ)言最佳實(shí)踐

C語(yǔ)言最佳實(shí)踐

定 價(jià):¥99.80

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

購(gòu)買這本書可以去


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

內(nèi)容簡(jiǎn)介

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

作者簡(jiǎn)介

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

圖書目錄

第 一篇 基礎(chǔ)篇

第 1章 提高代碼可讀性 3
1.1 代碼可讀性的級(jí)別 3
1.2 壞代碼的特點(diǎn) 4
1.2.1 壞代碼實(shí)例 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 其他常見(jiàn)的編碼風(fēng)格 11
1.4 提高代碼可讀性的最佳實(shí)踐 14
1.4.1 守好“80列”這條紅線 14
1.4.2 空格、大括號(hào)位置及縮進(jìn) 15
1.4.3 指針聲明和定義中的星號(hào)位置 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)格的最佳實(shí)踐 23
1.5.1 下畫線前綴的使用 24
1.5.2 錯(cuò)誤處理及集中返回 24
1.5.3 參數(shù)的合法性檢查 28
1.6 命名的藝術(shù) 32
1.7 實(shí)例分析 34
1.7.1 PurC函數(shù)庫(kù)頭文件 34
1.7.2 經(jīng)典的list_head結(jié)構(gòu)體及其接口 37

第 2章 用好寫好頭文件 40
2.1 重新認(rèn)識(shí)頭文件 40
2.1.1 頭文件的作用 40
2.1.2 頭文件的分類 42
2.1.3 頭文件機(jī)制的復(fù)雜性 47
2.2 濫用系統(tǒng)頭文件的負(fù)面影響 61
2.3 自定義頭文件中的常見(jiàn)問(wèn)題 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 未妥善處理可能的可移植性問(wèn)題 68
2.4 頭文件相關(guān)的最佳實(shí)踐 70
2.4.1 兩大原則 70
2.4.2 頭文件的劃分及典型內(nèi)容 71
2.4.3 頭文件的組織 77

第3章 消除編譯警告 83
3.1 為什么不能忽視編譯警告 83
3.1.1 潛在問(wèn)題恐釀成大禍 83
3.1.2 解讀編譯警告 84
3.2 常見(jiàn)的編譯警告及其分類 88
3.2.1 預(yù)處理警告 88
3.2.2 未使用警告 90
3.2.3 未初始化警告 93
3.2.4 類型安全警告 95
3.2.5 邏輯運(yùn)算相關(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 常見(jiàn)的常量使用問(wèn)題 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 巧用編譯時(shí)斷言 131
4.4 字符串的原子化 133

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

第二篇 模式篇

第6章 接口設(shè)計(jì)模式 155
6.1 何謂好接口 155
6.2 兩個(gè)接口設(shè)計(jì)原則 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庫(kù)的
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庫(kù)的錯(cuò)誤碼 184
6.6.4 范例2:PurC實(shí)例 185
6.7 模式4:事件驅(qū)動(dòng) 186
6.7.1 范例1:MiniGUI消息驅(qū)動(dòng)接口 187
6.7.2 范例2:glib的事件驅(qū)動(dòng)接口 196
6.7.3 事件處理器的粒度 199
6.8 模式5:通用數(shù)據(jù)結(jié)構(gòu) 202
6.8.1 范例1:在節(jié)點(diǎn)結(jié)構(gòu)體中保留用戶數(shù)據(jù)成員 202
6.8.2 范例2:在用戶結(jié)構(gòu)體中包含通用節(jié)點(diǎn)結(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 避免過(guò)度設(shè)計(jì) 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:強(qiáng)制使用新接口,將舊接口標(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 一個(gè)簡(jiǎn)單的例子 235
7.2.1 數(shù)據(jù)和代碼耦合的版本 235
7.2.2 數(shù)據(jù)和代碼解耦的版本 236
7.3 再來(lái)一個(gè)例子 238
7.4 更復(fù)雜的例子 241
7.4.1 最初的實(shí)現(xiàn) 243
7.4.2 改進(jìn)的版本 245
7.4.3 進(jìn)一步優(yōu)化 247
7.5 自動(dòng)生成代碼 249
7.5.1 使用宏生成代碼 249
7.5.2 使用程序生成代碼 251

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

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

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

第三篇 質(zhì)量篇

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

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

第 13章 高效調(diào)試 364
13.1 高效調(diào)試的基本原則 364
13.2 C程序常見(jiàn)錯(cuò)誤分類 365
13.2.1 編譯、鏈接錯(cuò)誤 365
13.2.2 疑難雜癥 366
13.3 內(nèi)存使用錯(cuò)誤 367
13.3.1 靜態(tài)數(shù)據(jù)使用錯(cuò)誤 367
13.3.2 堆使用錯(cuò)誤 372
13.3.3 棧使用錯(cuò)誤 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) www.afriseller.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)