万本电子书0元读

万本电子书0元读

顶部广告

C语言*佳实践电子书

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

售       价:¥

纸质售价:¥78.80购买纸书

0人正在读 | 0人评论 6.5

作       者:魏永明 著

出  版  社:人民邮电出版社有限公司

出版时间:2025-01-01

字       数:40.8万

所属分类: 科技 > 计算机/网络 > 程序设计

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
本书是魏永明近30年来发和维护MiniGUI、HVML等源项目的经验总结,旨在帮助有一定C程序编写经验的软件工程师在短时间内有效提高设计能力和编码水平。全书分为?3?篇。基础篇从可读性和可维护性出发,阐述了如何提高代码的可读性、用好写好头文件、正确理解编译警告并消除潜在问题、定义和使用常量等,介绍了如何有效利用构建系统生成器(CMake)来维护项目;模式篇阐述了常见的C程序口设计模式,说明了如何在C程序中解耦代码和数据、利用子驱动程序实现模型、设计可加载模块等,介绍了状态机的概念以及在C程序中如何利用状态机实现分词器、解析器等;质量篇从性能和单元测试出发,阐述了如何在C程序中避免编写低效代码、行单元测试、使用常见的单元测试框架等,介绍了高效调试C程序的若干技巧和工具。 本书适合从事系统软件、嵌式或物联网发的C程序员、计算机相关专业高年级本科生和研究生阅读。<br/>【推荐语】<br/>【30年源实战经验】作者倾囊相授,带你领略源项目的发与维护之道。 【代码艺术,一目了然】从可读性到可维护性,从口设计到性能优化,再到单元测试,本书教你如何写出优雅高效的C代码。 【项目维护利器CMake】掌握构建系统生成器CMake,提升代码可移植性,灵活处理功能模块,自动生成源代码,让项目维护变得轻松自如。 【口设计,解耦大师】深C程序口设计模式,教你如何解耦代码与数据,实现模块化设计,掌握状态机在C程序中的应用,造高效分词器、解析器。 【性能优化,测试先行】性能到测试,本书提供了一系列避免低效代码的策略,教你如何行单元测试,使用测试框架,以及高效调试C程序的技巧和工具。<br/>【作者】<br/>魏永明,获清华大学工学学士、硕士学位,飞漫软件创始人,2013年度“源软件杰出贡献人物”,2023年世界源软件Top100贡献榜人物。1999年发布了源软件MiniGUI并持续研发至今。编(译)著有《MiniGUI剖析》、《Linux 实用教程》、《Linux 设备驱动程序》(二、三版)等技术著作。2018年11月,发起合璧操作系统源协作项目;2020年8月,提出首款描述式编程语言HVML;2022年7月,源发布 HVML 解释器及渲染器。<br/>
目录展开

内 容 提 要

推 荐 语

前 言

资源与支持

第一篇 基础篇

第1章 提高代码可读性

1.1 代码可读性的级别

1.2 坏代码的特点

1.2.1 坏代码实例

1.2.2 妙手理码

1.3 编码风格的内容

1.3.1 Linux内核编码风格的一些规定

1.3.2 其他常见的编码风格

1.4 提高代码可读性的最佳实践

1.4.1 守好“80列”这条红线

1.4.2 空格、大括号位置及缩进

1.4.3 指针声明和定义中的星号位置

1.4.4 善用类型定义

1.4.5 命名规则保持一致

1.4.6 正确书写注释

1.4.7 优雅编写条件编译代码

1.5 其他有关编码风格的最佳实践

1.5.1 下画线前缀的使用

1.5.2 错误处理及集中返回

1.5.3 参数的合法性检查

1.6 命名的艺术

1.7 实例分析

1.7.1 PurC函数库头文件

1.7.2 经典的list_head结构体及其接口

第2章 用好写好头文件

2.1 重新认识头文件

2.1.1 头文件的作用

2.1.2 头文件的分类

2.1.3 头文件机制的复杂性

2.2 滥用系统头文件的负面影响

2.3 自定义头文件中的常见问题

2.3.1 不使用或不当定义头文件保卫宏

2.3.2 未正确处理和C++程序混用的情形

2.3.3 未处理可能的重复定义

2.3.4 包含不该出现在头文件中的内容

2.3.5 未妥善处理可能的可移植性问题

2.4 头文件相关的最佳实践

2.4.1 两大原则

2.4.2 头文件的划分及典型内容

2.4.3 头文件的组织

第3章 消除编译警告

3.1 为什么不能忽视编译警告

3.1.1 潜在问题恐酿成大祸

3.1.2 解读编译警告

3.2 常见的编译警告及其分类

3.2.1 预处理警告

3.2.2 未使用警告

3.2.3 未初始化警告

3.2.4 类型安全警告

3.2.5 逻辑运算相关的警告

3.2.6 格式化相关警告

3.2.7 词法警告

3.2.8 其他警告

3.3 编译警告和函数属性

3.3.1 malloc属性

3.3.2 nonnull属性

3.3.3 warn_unused_result属性

3.3.4 format属性

3.3.5 其他函数属性

3.4 消除编译警告只是开始

第4章 常量的定义和使用

4.1 常见的常量使用问题

4.1.1 立即数常量

4.1.2 字符串常量

4.2 正确定义和使用常量

4.2.1 立即数常量

4.2.2 字符串常量

4.3 优雅定义和使用常量

4.3.1 借助编译器

4.3.2 使用宏生成常量和代码

4.3.3 巧用编译时断言

4.4 字符串的原子化

第5章 充分利用构建系统生成器

5.1 常用构建系统和构建系统生成器

5.2 CMake影响编码的选项或功能

5.2.1 构建类型

5.2.2 处理平台差异

5.2.3 自动生成代码

5.3 CMake构建体系模板

5.3.1 整体结构和复制步骤

5.3.2 多平台支持

5.3.3 检测系统头文件、函数或结构体成员

5.3.4 查找第三方软件包

5.3.5 自定义功能测试

第二篇 模式篇

第6章 接口设计模式

6.1 何谓好接口

6.2 两个接口设计原则

6.3 一般性方法和技巧

6.3.1 完备性的保证

6.3.2 参数及返回值

6.4 模式1:抽象数据类型

6.4.1 范例1:变体

6.4.2 范例2:读写流

6.4.3 范例3:描述符或句柄

6.5 模式2:抽象算法

6.5.1 范例1:标准C库的qsort()函数及其扩展

6.5.2 范例2:MiniGUI的曲线生成器函数

6.6 模式3:上下文

6.6.1 显式上下文

6.6.2 隐式上下文

6.6.3 范例1:标准C库的错误码

6.6.4 范例2:PurC实例

6.7 模式4:事件驱动

6.7.1 范例1:MiniGUI消息驱动接口

6.7.2 范例2:glib的事件驱动接口

6.7.3 事件处理器的粒度

6.8 模式5:通用数据结构

6.8.1 范例1:在节点结构体中保留用户数据成员

6.8.2 范例2:在用户结构体中包含通用节点结构体

6.9 模式6:同类聚合

6.9.1 范例1:STDIO接口中的同类聚合

6.9.2 范例2:MiniGUI中图片装载接口的同类聚合

6.9.3 范例3:PurC变体接口中的同类聚合

6.9.4 避免过度设计

6.10 模式7:遍历和迭代

6.10.1 方法1:遍历宏

6.10.2 方法2:遍历回调

6.10.3 方法3:迭代器

6.11 模式8:接口的扩展和兼容性

6.11.1 方法1:新旧接口共存

6.11.2 方法2:旧接口只是新接口的绕转接口

6.11.3 方法3:强制使用新接口,将旧接口标记为废弃或移除

6.11.4 方法4:预留扩展能力

6.11.5 扩展接口需要考虑的因素

6.12 综合范例:PurC中的有序数组

第7章 解耦代码和数据

7.1 解耦代码和数据的重要性

7.2 一个简单的例子

7.2.1 数据和代码耦合的版本

7.2.2 数据和代码解耦的版本

7.3 再来一个例子

7.4 更复杂的例子

7.4.1 最初的实现

7.4.2 改进的版本

7.4.3 进一步优化

7.5 自动生成代码

7.5.1 使用宏生成代码

7.5.2 使用程序生成代码

第8章 子驱动程序实现模型

8.1 抽象的重要性

8.2 随处可见的子驱动程序实现模型

8.3 子驱动程序实现模型的构成

8.3.1 子驱动程序上下文结构体指针

8.3.2 子驱动程序操作集

8.3.3 普通文件流对象的子驱动程序实现

8.3.4 内存缓冲区流对象的子驱动程序实现

8.3.5 进一步思考

8.4 正确区分机制和策略

8.5 子驱动程序实现模型的演进

8.5.1 最初的设计和实现

8.5.2 反思一:子驱动程序操作集的定义是否足够完备和灵活

8.5.3 反思二:子驱动程序的实现中是否含有不该有的策略

8.5.4 反思三:还有哪些可以改进的地方

第9章 动态加载模块

9.1 可加载模块的好处

9.2 软件栈和可加载模块的设计原则

9.3 可加载模块的实现原理和要点

9.3.1 可加载模块的底层机制

9.3.2 可加载模块新旧版本的兼容性

9.3.3 可加载模块的实现要点

9.4 使用可加载模块支持新的图片格式

9.5 重用已有子驱动程序的实现

9.5.1 合成器操作集

9.5.2 合成器相关的应用程序接口

9.5.3 派生一个自己的合成器

9.5.4 装载模块定义的默认合成器

第10章 状态机

10.1 状态机的概念

10.2 定义一个状态机

10.3 正确理解状态机

10.4 状态机在各类解析器中的应用

10.4.1 简单示例:判断C语言立即数的进制

10.4.2 复杂示例:HTML解析器中的分词器

第三篇 质量篇

第11章 为性能编码

11.1 何谓“性能”

11.2 提高性能的3个基本原则

11.2.1 不要做无用功

11.2.2 杀鸡莫用牛刀

11.2.3 避免滥用内存分配

11.3 实例研究:字符串匹配

11.3.1 最直接的实现

11.3.2 利用哈希算法进行优化

11.3.3 字符串的原子化

11.4 实例研究:如何判断一个自然数是不是素数

11.4.1 小于16的自然数

11.4.2 可表示为无符号短整型的自然数

11.4.3 可表示为64位无符号长整型的自然数

11.5 实例研究:像素混合的并行计算

11.6 实例研究:达夫设备

第12章 单元测试

12.1 单元测试的基本概念和重要性

12.2 单元测试的基本方法

12.2.1 单元测试可以无处不在

12.2.2 单元测试方法和测试用例的选择

12.2.3 单元测试的自动化

12.3 单元测试框架

12.3.1 GLib Testing

12.3.2 GoogleTest

12.3.3 CTest

12.4 实例研究:HVML MATH对象的eval方法

12.4.1 测试目标

12.4.2 测试方法

12.4.3 使用现有可信赖的工具生成预期结果

第13章 高效调试

13.1 高效调试的基本原则

13.2 C程序常见错误分类

13.2.1 编译、链接错误

13.2.2 疑难杂症

13.3 内存使用错误

13.3.1 静态数据使用错误

13.3.2 堆使用错误

13.3.3 栈使用错误

13.4 内存诊断工具

13.4.1 Efence

13.4.2 ASAN

13.4.3 Valgrind

13.5 日志

后 记

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部