• C语言最佳实践
21年品牌 40万+商家 超1.5亿件商品

C语言最佳实践

全新正版 极速发货

61.69 6.2折 99.8 全新

库存7件

广东广州
认证卖家担保交易快速发货售后保障

作者魏永明 著

出版社人民邮电出版社

ISBN9787115645142

出版时间2025-01

装帧平装

开本16开

定价99.8元

货号1203486872

上书时间2025-01-04

大智慧小美丽

已实名 已认证 进店 收藏店铺

   商品详情   

品相描述:全新
商品描述
作者简介
魏永明,获清华大学工学学士、硕士学位,飞漫软件创始人,2013年度“开源软件杰出贡献人物”,2023年世界开源软件Top100贡献榜人物。1999年发布了开源软件MiniGUI并持续研发至今。编(译)著有《MiniGUI剖析》、《Linux 实用教程》、《Linux 设备驱动程序》(二、三版)等技术著作。2018年11月,发起合璧操作系统开源协作项目;2020年8月,提出首款描述式编程语言HVML;2022年7月,开源发布 HVML 解释器及渲染器。

目录
第 一篇 基础篇

第 1章  提高代码可读性   3
1.1  代码可读性的级别   3
1.2  坏代码的特点   4
1.2.1  坏代码实例   5
1.2.2  妙手理码   7
1.3  编码风格的内容   9
1.3.1  Linux内核编码风格的一些规定   10
1.3.2  其他常见的编码风格   11
1.4  提高代码可读性的最佳实践   14
1.4.1  守好“80列”这条红线   14
1.4.2  空格、大括号位置及缩进   15
1.4.3  指针声明和定义中的星号位置   16
1.4.4  善用类型定义   16
1.4.5  命名规则保持一致   19
1.4.6  正确书写注释   20
1.4.7  优雅编写条件编译代码   21
1.5  其他有关编码风格的最佳实践   23
1.5.1  下画线前缀的使用   24
1.5.2  错误处理及集中返回   24
1.5.3  参数的合法性检查   28
1.6  命名的艺术   32
1.7  实例分析   34
1.7.1  PurC函数库头文件   34
1.7.2  经典的list_head结构体及其接口   37

第 2章  用好写好头文件   40
2.1  重新认识头文件   40
2.1.1  头文件的作用   40
2.1.2  头文件的分类   42
2.1.3  头文件机制的复杂性   47
2.2  滥用系统头文件的负面影响   61
2.3  自定义头文件中的常见问题   62
2.3.1  不使用或不当定义头文件保卫宏   62
2.3.2  未正确处理和C++程序混用的情形   63
2.3.3  未处理可能的重复定义   65
2.3.4  包含不该出现在头文件中的内容   66
2.3.5  未妥善处理可能的可移植性问题   68
2.4  头文件相关的最佳实践   70
2.4.1  两大原则   70
2.4.2  头文件的划分及典型内容   71
2.4.3  头文件的组织   77

第3章  消除编译警告   83
3.1  为什么不能忽视编译警告   83
3.1.1  潜在问题恐酿成大祸   83
3.1.2  解读编译警告   84
3.2  常见的编译警告及其分类   88
3.2.1  预处理警告   88
3.2.2  未使用警告   90
3.2.3  未初始化警告   93
3.2.4  类型安全警告   95
3.2.5  逻辑运算相关的警告   99
3.2.6  格式化相关警告   102
3.2.7  词法警告   105
3.2.8  其他警告   109
3.3  编译警告和函数属性   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  其他函数属性   113
3.4  消除编译警告只是开始   114

第4章  常量的定义和使用   116
4.1  常见的常量使用问题   116
4.1.1  立即数常量   116
4.1.2  字符串常量   119
4.2  正确定义和使用常量   121
4.2.1  立即数常量   121
4.2.2  字符串常量   127
4.3  优雅定义和使用常量   127
4.3.1  借助编译器   127
4.3.2  使用宏生成常量和代码   130
4.3.3  巧用编译时断言   131
4.4  字符串的原子化   133

第5章  充分利用构建系统生成器   136
5.1  常用构建系统和构建系统生成器   136
5.2  CMake影响编码的选项或功能   138
5.2.1  构建类型   138
5.2.2  处理平台差异   139
5.2.3  自动生成代码   142
5.3  CMake构建体系模板   143
5.3.1  整体结构和复制步骤   143
5.3.2  多平台支持   149
5.3.3  检测系统头文件、函数或结构体成员   150
5.3.4  查找第三方软件包   151
5.3.5  自定义功能测试   152

第二篇 模式篇

第6章  接口设计模式   155
6.1  何谓好接口   155
6.2  两个接口设计原则   157
6.3  一般性方法和技巧   161
6.3.1  完备性的保证   161
6.3.2  参数及返回值   162
6.4  模式1:抽象数据类型   164
6.4.1  范例1:变体   166
6.4.2  范例2:读写流   169
6.4.3  范例3:描述符或句柄   173
6.5  模式2:抽象算法   174
6.5.1  范例1:标准C库的
qsort()函数及其扩展   177
6.5.2  范例2:MiniGUI的曲线生成器函数   179
6.6  模式3:上下文   181
6.6.1  显式上下文   181
6.6.2  隐式上下文   183
6.6.3  范例1:标准C库的错误码   184
6.6.4  范例2:PurC实例   185
6.7  模式4:事件驱动   186
6.7.1  范例1:MiniGUI消息驱动接口   187
6.7.2  范例2:glib的事件驱动接口   196
6.7.3  事件处理器的粒度   199
6.8  模式5:通用数据结构   202
6.8.1  范例1:在节点结构体中保留用户数据成员   202
6.8.2  范例2:在用户结构体中包含通用节点结构体   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  避免过度设计   214
6.10  模式7:遍历和迭代   215
6.10.1  方法1:遍历宏   215
6.10.2  方法2:遍历回调   218
6.10.3  方法3:迭代器   220
6.11  模式8:接口的扩展和兼容性   222
6.11.1  方法1:新旧接口共存   222
6.11.2  方法2:旧接口只是新接口的绕转接口   224
6.11.3  方法3:强制使用新接口,将旧接口标记为废弃或移除   225
6.11.4  方法4:预留扩展能力   225
6.11.5  扩展接口需要考虑的因素   229
6.12  综合范例:PurC中的有序数组   229

第7章  解耦代码和数据   233
7.1  解耦代码和数据的重要性   233
7.2  一个简单的例子   235
7.2.1  数据和代码耦合的版本   235
7.2.2  数据和代码解耦的版本   236
7.3  再来一个例子   238
7.4  更复杂的例子   241
7.4.1  最初的实现   243
7.4.2  改进的版本   245
7.4.3  进一步优化   247
7.5  自动生成代码   249
7.5.1  使用宏生成代码   249
7.5.2  使用程序生成代码   251

第8章  子驱动程序实现模型   256
8.1  抽象的重要性   256
8.2  随处可见的子驱动程序实现模型   257
8.3  子驱动程序实现模型的构成   258
8.3.1  子驱动程序上下文结构体指针   259
8.3.2  子驱动程序操作集   260
8.3.3  普通文件流对象的子驱动程序实现   261
8.3.4  内存缓冲区流对象的子驱动程序实现   262
8.3.5  进一步思考   264
8.4  正确区分机制和策略   265
8.5  子驱动程序实现模型的演进   266
8.5.1  最初的设计和实现   266
8.5.2  反思一:子驱动程序操作集的定义是否足够完备和灵活   269
8.5.3  反思二:子驱动程序的实现中是否含有不该有的策略   271
8.5.4  反思三:还有哪些可以改进的地方   273

第9章  动态加载模块   275
9.1  可加载模块的好处   275
9.2  软件栈和可加载模块的设计原则   275
9.3  可加载模块的实现原理和要点   278
9.3.1  可加载模块的底层机制   278
9.3.2  可加载模块新旧版本的兼容性   278
9.3.3  可加载模块的实现要点   280
9.4  使用可加载模块支持新的图片格式   281
9.5  重用已有子驱动程序的实现   285
9.5.1  合成器操作集   286
9.5.2  合成器相关的应用程序接口   287
9.5.3  派生一个自己的合成器   288
9.5.4  装载模块定义的默认合成器   289

第 10章  状态机   292
10.1  状态机的概念   292
10.2  定义一个状态机   293
10.3  正确理解状态机   295
10.4  状态机在各类解析器中的应用   297
10.4.1  简单示例:判断C语言立即数的进制   297
10.4.2  复杂示例:HTML解析器中的分词器   299

第三篇 质量篇

第 11章  为性能编码   309
11.1  何谓“性能”   309
11.2  提高性能的3个基本原则   312
11.2.1  不要做无用功   312
11.2.2  杀鸡莫用牛刀   314
11.2.3  避免滥用内存分配   315
11.3  实例研究:字符串匹配   318
11.3.1  最直接的实现   319
11.3.2  利用哈希算法进行优化   320
11.3.3  字符串的原子化   326
11.4  实例研究:如何判断一个自然数是不是素数   331
11.4.1  小于16的自然数   331
11.4.2  可表示为无符号短整型的自然数   332
11.4.3  可表示为64位无符号长整型的自然数   334
11.5  实例研究:像素混合的并行计算   335
11.6  实例研究:达夫设备   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  测试目标   359
12.4.2  测试方法   360
12.4.3  使用现有可信赖的工具生成预期结果   362

第 13章  高效调试   364
13.1  高效调试的基本原则   364
13.2  C程序常见错误分类   365
13.2.1  编译、链接错误   365
13.2.2  疑难杂症   366
13.3  内存使用错误   367
13.3.1  静态数据使用错误   367
13.3.2  堆使用错误   372
13.3.3  栈使用错误   379
13.4  内存诊断工具   381
13.4.1  Efence   381
13.4.2  ASAN   384
13.4.3  Valgrind   386
13.5  日志   391

后记   396

内容摘要
本书是魏永明近30年来开发和维护MiniGUI、HVML等开源项目的经验总结,旨在帮助有一定C程序编写经验的软件工程师在短时间内有效提高设计能力和编码水平。全书分为?3?篇。基础篇从可读性和可维护性出发,阐述了如何提高代码的可读性、用好写好头文件、正确理解编译警告并消除潜在问题、定义和使用常量等,介绍了如何有效利用构建系统生成器(CMake)来维护项目;模式篇阐述了常见的C程序接口设计模式,说明了如何在C程序中解耦代码和数据、利用子驱动程序实现模型、设计可加载模块等,介绍了状态机的概念以及在C程序中如何利用状态机实现分词器、解析器等;质量篇从性能和单元测试出发,阐述了如何在C程序中避免编写低效代码、进行单元测试、使用常见的单元测试框架等,介绍了高效调试C程序的若干技巧和工具。
本书适合从事系统软件、嵌入式或物联网开发的C程序员、计算机相关专业高年级本科生和研究生阅读。

主编推荐
【30年开源实战经验】作者倾囊相授,带你领略开源项目的开发与维护之道。
【代码艺术,一目了然】从可读性到可维护性,从接口设计到性能优化,再到单元测试,本书教你如何写出优雅高效的C代码。
【项目维护利器CMake】掌握构建系统生成器CMake,提升代码可移植性,灵活处理功能模块,自动生成源代码,让项目维护变得轻松自如。
【接口设计,解耦大师】深入C程序接口设计模式,教你如何解耦代码与数据,实现模块化设计,掌握状态机在C程序中的应用,打造高效分词器、解析器。
【性能优化,测试先行】性能到测试,本书提供了一系列避免低效代码的策略,教你如何进行单元测试,使用测试框架,以及高效调试C程序的技巧和工具。

—  没有更多了  —

以下为对购买帮助不大的评价

此功能需要访问孔网APP才能使用
暂时不用
打开孔网APP