fbpx

[email protected]

购物车

 查看订单

  • 我的帐户
东东购 | EasternEast
  • 中文书店
    • 畅销排行榜
      • 小说 畅销榜
      • 童书 畅销榜
      • 外语畅销榜
      • 管理畅销榜
      • 法律畅销榜
      • 青春文学畅销榜
    • 热门分类
      • 社会小说
      • 成功/励志 畅销榜
      • 人物传记
      • 大陆原创
      • 绘本童书
      • 影视小说
    • 文学推荐
      • 文集
      • 戏剧
      • 纪实文学
      • 名家作品
      • 民间文学
      • 中国现当代随笔
    • 新书热卖榜
      • 小说 新书热卖榜
      • 青春文学 新书热卖榜
      • 童书 新书热卖榜
      • 管理 新书热卖榜
      • 成功/励志 新书热卖榜
      • 艺术 新书热卖榜
  • 精选分类
    • 小说
    • 保健养生
    • 烹饪/美食
    • 风水/占卜
    • 青春文学
    • 童书
    • 管理
    • 成功/励志
    • 文学
    • 哲学/宗教
    • 传记
    • 投资理财
    • 亲子家教
    • 动漫/幽默
    • 法律 Legal
    • 经济 Economics
    • 所有分类
  • 关于东东
  • 帮我找书
搜索
首页计算机/网络程序设计C语言最佳实践

C语言最佳实践

作者:魏永明 出版社:人民邮电出版社 出版时间:2025年01月 

ISBN: 9787115645142
年中特卖用“SALE15”折扣卷全场书籍85折!可与三本88折,六本78折的优惠叠加计算!全球包邮!
trust badge

EUR €58.99

类别: 计算机/网络 新书热卖榜, 程序设计 SKU:67916a33a15f9082ca72d56c 库存: 有现货
  • 描述
  • 评论( 0 )

描述

开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787115645142

编辑推荐

【30年开源实战经验】作者倾囊相授,带你领略开源项目的开发与维护之道。

【代码艺术,一目了然】从可读性到可维护性,从接口设计到性能优化,再到单元测试,本书教你如何写出优雅高效的C代码。

【项目维护利器CMake】掌握构建系统生成器CMake,提升代码可移植性,灵活处理功能模块,自动生成源代码,让项目维护变得轻松自如。

【接口设计,解耦大师】深入C程序接口设计模式,教你如何解耦代码与数据,实现模块化设计,掌握状态机在C程序中的应用,打造高效分词器、解析器。

【性能优化,测试先行】性能到测试,本书提供了一系列避免低效代码的策略,教你如何进行单元测试,使用测试框架,以及高效调试C程序的技巧和工具。

 

内容简介

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

本书适合从事系统软件、嵌入式或物联网开发的C程序员、计算机相关专业高年级本科生和研究生阅读。

作者简介

魏永明,获清华大学工学学士、硕士学位,飞漫软件创始人,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

抢先评论了 “C语言最佳实践” 取消回复

评论

还没有评论。

相关产品

加入购物车

码农翻身(好玩有趣的编程知识)

EUR €43.99
评分 5.00 / 5
加入购物车

学习使用C指针(影印版)

EUR €27.99
加入购物车

利用Python进行数据分析(原书第2版)

EUR €68.99
评分 5.00 / 5
加入购物车

Unity 3D脚本编程——使用C#语言开发跨平台游戏

EUR €48.99

东东购的宗旨是服务喜爱阅读中文书籍的海外人民,提供一个完善的购书平台,让国人不论何时何地都能沉浸在书香之中,读着熟悉的中文字,回忆着家乡的味道。


安全加密结账 安心网络购物 支持Paypal付款

常见问题

  • 货物配送
  • 退换货政策
  • 隐私政策
  • 联盟营销

客户服务

  • 联系东东
  • 关于东东
  • 帮我找书
  • 货物追踪
  • 会员登入

订阅最新的优惠讯息和书籍资讯

选择币别

EUR
USD
CAD
AUD
NZD
NOK
GBP
CHF
SEK
CNY
UAH
ILS
SAR
MXN
KRW
MYR
SGD
HUF
TRY
JPY
HKD
TWD
facebookinstagram
©2020 东东购 EasternEast.com

限时特卖:用“SALE15”优惠券全场书籍85折!可与三本88折,六本78折的优惠叠加计算。 忽略