登入帳戶  | 訂單查詢  | 購物車/收銀台(0) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入   新用戶註冊
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / 物流,時效:出貨後2-4日

2024年10月出版新書

2024年09月出版新書

2024年08月出版新書

2024年07月出版新書

2024年06月出版新書

2024年05月出版新書

2024年04月出版新書

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

『簡體書』C++之美:代码简洁、安全又跑得快的30个要诀

書城自編碼: 4008283
分類: 簡體書→大陸圖書→計算機/網絡程序設計
作者: [英]J. Guy Davidson[J. 盖伊·戴维森],
國際書號(ISBN): 9787121482434
出版社: 电子工业出版社有限公司
出版日期: 2024-07-01

頁數/字數: /
書度/開本: 16开 釘裝: 平装

售價:NT$ 556

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
从康德到黑格尔的发展:兼论宗教哲学(英国观念论名著译丛)
《 从康德到黑格尔的发展:兼论宗教哲学(英国观念论名著译丛) 》

售價:NT$ 275.0
突破不可能:用特工思维提升领导力
《 突破不可能:用特工思维提升领导力 》

售價:NT$ 352.0
王阳明大传:知行合一的心学智慧(精装典藏版)
《 王阳明大传:知行合一的心学智慧(精装典藏版) 》

售價:NT$ 1010.0
失衡与重塑——百年变局下的中国与世界经济
《 失衡与重塑——百年变局下的中国与世界经济 》

售價:NT$ 602.0
不被定义的年龄:积极年龄观让我们更快乐、健康、长寿
《 不被定义的年龄:积极年龄观让我们更快乐、健康、长寿 》

售價:NT$ 352.0
南方谈话:邓小平在1992
《 南方谈话:邓小平在1992 》

售價:NT$ 367.0
纷纭万端 : 近代中国的思想与社会
《 纷纭万端 : 近代中国的思想与社会 》

售價:NT$ 500.0
中国古代文体形态研究(第四版)(中华当代学术著作辑要)
《 中国古代文体形态研究(第四版)(中华当代学术著作辑要) 》

售價:NT$ 765.0

建議一齊購買:

+

NT$ 624
《 Three.js开发指南:基于WebGL和HTML5在网页上渲染3D图形和动画(原书第3版) 》
+

NT$ 458
《 Excelize权威指南 》
+

NT$ 505
《 Go底层原理与工程化实践 李乐 陈雷 》
+

NT$ 560
《 Python编程 从入门到实践 第3版 》
+

NT$ 611
《 R语言实战(第3版) 》
+

NT$ 454
《 JavaScript快速入门与开发实战 》
編輯推薦:
编写优质的C 代码说难也不难。《C 核心准则》可以帮助每一位C 开发者设计和编写极其可靠、高效且行为正确的C 程序。然而,这份文档中大量极好的建议堆积在一起,让人不知该从何处着手。那么就从这本《C 之美》开始吧。
C 专家J.Guy Davidson和Kate Gregory选出30条特别有价值的核心准则,并提供了改进C 代码风格的详尽的实用知识。为便于参考,本书的结构与《C 核心准则》保持高度一致。
J.Guy Davidson和Kate Gregory在全书中都提供了有用的概念性见解和专家级示例代码,阐明了行之有效的方法,以便更加成功地运用新的和长期存在的语言特性,他们还展示了如何默认写出更健壮、更高效的程序。
O 防止“避重就轻”:不要在细枝末节上浪费宝贵的时间
O不要编写以后会出问题的代码,以至于伤害到自己
O 了解哪些遗留特性需要避开,而改用现代特性
O 正确使用更新的特性,得其裨益而不产生新的问题
O 默认写出静态类型安全、防泄漏且易于演进的更高质量的代码
O 将核心准则用于所有现代C 版本:C 20、C 17、C 14或C 11
內容簡介:
本书从《C 核心准则》(C Core Guidelines)中精心挑选了 30 条准则进行细致、深入的讲解。内容涵盖C 语言最主要的方面,如类型系统、面向对象、模板和元编程、错误处理、程序性能、常量性等,其间又恰如其分地穿插了编码风格、设计模式等主题。书中汇集了作者数十年职业生涯的经验和一些有趣的示例,除了深刻的见解,行文也充满了趣味性。作者试图通过这种突出重点、以点带面的方式帮助读者了解并学习《C 核心准则》,进而更深入地掌握 C 这门编程语言,特别是它的\现代”形态。本书适合各种经验水平的 C 开发者阅读。
關於作者:
J. Guy Davidson于1980年通过Acorn Atom首次接触编程。他青少年时代的大部分时间都在各种家用电脑上编写游戏。后来,他从苏塞克斯大学获得了数学学位,开始涉足戏剧,还在一个灵魂乐队中担任键盘手。20世纪90年代初,他决定编写演示程序,并于1997年开始在Codemasters的伦敦办公室工作,从此进入游戏行业。1999年,Davidson加入了Creative Assembly,现在是那里的工程实践主管。他主要负责《全面战争》(Total War)系列游戏的工作,整理早期的游戏目录,以及提升工程团队成员的编程水平。他是IGGI咨询委员会、BSI C 小组和ISO C 委员会的委员,还是ACCU(Association of C/C Users,C/C 用户协会)负责C 标准相关事宜的成员,并在ACCU的编程委员会任职。他是#include Discord服务器的管理员。他担任多个组织的行为准则负责人,在C 会议和各种聚会上发言,特别是关于在标准库中增加线性代数的议题。Kate Gregory接触编程、与几位最亲密的朋友结识,以及丈夫的相识,都发生在1977年的滑铁卢大学,所有这些她从未后悔过。她的学位是化学工程,这正说明你很难从一个人的学位中看出什么。她在加拿大安大略省乡下的地下室有一个小房间,里面放着一些古老的计算机:PET、C64、手工焊接的6502系统等,她把这些作为那个单纯年代的纪念品。自1986年起,她与丈夫一起经营Gregory咨询公司,帮助世界各地的客户更好地开展业务。Kate曾在五个大洲做过主题演讲,爱发掘一些改变认知的真相,然后与人分享,她还投入大量的时间在各种C 活动中做志愿者。其中“#include ”是她的最爱,该社区正在改变这个行业,使其更受欢迎也更具包容性。他们的Discord服务器是一处温馨的场所,初学者在那里可以学习C ,也可以为WG21合写文章以改变我们所使用的编程语言,或者做任何介于两者之间的事情。
译者:王江平,Autodesk软件开发工程师,毕业于同济大学/上海交通大学,爱编程,爱读书,爱翻译,爱C 。译有《C#3.0设计模式》、《敏捷开发的艺术》、《软件开发者路线图》、《Java语言精粹》、《Python计算与编程实践》、《Cucumber:行为驱动开发指南》等书籍。(微博@steedhorse,欢迎交流)
目錄
第1章 避重就轻不可取 1
1.1 P.2:使用ISO标准C 编写代码 2
什么是ISO标准C 2
封装差异 4
了解以前的用法 8
紧跟标准的发展 9
1.2 F.51:在有选择的情况下,优先使用默认参数而非重载 12
引言 12
改进抽象概念:是增加参数还是重载 13
微妙的重载解决 14
回到示例代码 16
默认参数天然的明确性 18
函数重载的替代方案 19
有时必须重载 19
小结 20
1.3 C.45:不要定义仅初始化数据成员的默认构造函数,而应使用类内成员
初始化 21
为什么要有默认构造函数 21
你是怎样初始化数据成员的 22
两个人维护一个类时会怎样 25
小结 27
1.4 C.131:避免平凡的get和set函数 28
一种古老的惯用法 28
抽象 29
单纯的封装 31
类不变式 34
名词和动词 36
小结 37
1.5 ES.10:每条语句只声明一个名字 38
我来引入你 38
向后兼容 40
写出更加清晰的声明 42
结构式绑定 43
小结 44
1.6 NR.2:不强求函数只用一条return语句 45
规则会演化 45
确保资源得到清理 47
使用RAII 50
编写好的函数 52
小结 54
第2章 不要伤害自己 55
2.1 P.11:将凌乱的构造封装起来,而不是使其散布于代码中 56
“一口吞”式做法 56
封装一种凌乱的构造意味着什么 58
语言的目的和抽象的本质 60
抽象的层次 63
通过重构和分割实现抽象 64
小结 65
2.2 I.23:尽量减少函数参数 66
他们应该挣多少 66
通过抽象简化问题 68
尽可能少,但不要更少 70
现实例子 72
小结 73
2.3 I.26:使用C风格子集获取跨编译器的ABI 74
创建程序库 74
什么是ABI 75
最小的C风格子集 77
异常的传播 79
小结 80
2.4 C.47:按声明的顺序定义并初始化成员变量 82
小结 90
2.5 CP.3:尽量减少可写数据的显式共享 91
传统执行模型 91
等等,不止这些 93
避免死锁和数据竞争 95
抛开锁和互斥体 97
小结 100
2.6 T.120:只在真正需要时使用模板元编程 101
std::enable_if => requires 108
小结 112
第3章 别再使用 113
3.1 I.11:切勿通过原生指针(T*)或引用(T&)转移所有权 114
使用自由存储区 114
智能指针的性能成本 117
使用未修饰的引用语义 118
gsl::owner 119
小结 121
3.2 I.3:避免使用单例 122
全局对象是不好的 122
单例设计模式 123
静态初始化顺序的尴尬 123
如何隐藏一个单例 125
但它就该只有一份 127
等一下…… 128
小结 130
3.3 C.90:使用构造函数和赋值运算符,而不是memset和memcpy 131
追求最优性能 131
构造函数的巨大开销 132
最简单的类 133
C 标准到底在说什么 135
那么,memcpy呢 137
永远不要低估编译器 139
小结 140
3.4 ES.50:不要用强制转换去除const限定符 141
故事时间 141
处理更大的数据量 142
const防火墙 143
实现双接口 144
缓存和懒惰求值 146
两种类型的const 147
const惊奇篇 149
小结 150
3.5 E.28:避免基于全局状态(如errno)的错误处理 151
错误处理很难 151
C和errno 151
返回错误代码 153
异常 154
<system_error> 154
Boost.Outcome 155
错误处理为何这样难 156
隧道尽头的光 158
小结 159
3.6 SF.7:不要在头文件的全局作用域写using namespace 160
不要这样做 160
消除歧义 161
使用using 162
符号去了哪里 163
一个更加隐蔽的问题 166
解决作用域解析运算符的杂乱问题 168
诱惑与堕落 169
小结 169
第4章 正确使用新特性 171
4.1 F.21:优先选择结构体或元组返回多个“输出”值 172
函数签名的形式 172
文档和注解 173
现在可以返回对象了 174
也可以返回元组 177
使用非const引用传递和返回 179
小结 182
4.2 Enum.3:优先选择class枚举而不是“普通”枚举 183
常量 183
作用域枚举 185
基础类型 187
隐式转换 188
小结 190
后记 190
4.3 ES.5:保持作用域短小 191
作用域的性质 191
块作用域 192
名字空间作用域 193
类作用域 196
函数参数作用域 198
枚举作用域 199
模板参数作用域 200
作用域作为上下文 201
小结 202
4.4 Con.5:使用constexpr表示编译时可以计算的值 203
从const到constexpr 203
默认的C 205
使用constexpr 206
inline 210
constevel 211
constinit 212
小结 213
4.5 T.1:使用模板提高代码的抽象层次 214
故事时间 214
提高抽象的层次 216
函数模板和抽象 218
类模板和抽象 220
命名很难 222
小结 223
4.6 T.10:为所有模板参数指定概念 224
来龙去脉 224
约束你的参数 226
如何抽象你的概念 229
通过概念分解 232
小结 233
第5章 默认写出好代码 234
5.1 P.4:在理想情况下,程序应具有静态类型安全性 235
类型安全是C 的一项安全特性 235
联合体 237
类型转换 238
无符号数 241
缓冲区和大小 244
小结 245
5.2 P.10:优先选择不可变数据而不是可变数据 246
错误的默认设置 246
函数声明中的常量性 248
小结 252
5.3 I.30:封装违反规则的部分 253
隐藏生活中不悦目的东西 253
保全体面 255
小结 260
5.4 ES.22:初始值确定后再声明变量 261
表达式和语句的重要性 261
C风格的声明 262
先声明后初始化 263
尽可能推迟的声明 264
上下文特定功能的局部化 266
消除状态 268
小结 270
5.5 Per.7:为促成优化而设计 271
帧率最大化 271
离硬件更远之后 273
通过抽象进行优化 276
小结 278
5.6 E.6:使用RAII防止泄漏 279
确定性析构 279
文件泄漏 281
为什么要做这些 284
似乎还是有点儿多:未来的可能性 286
从哪里获得这些工具 289
后记 291
跋 293
【C 核心准则精选】
P.2:使用ISO标准C 编写代码(1.1节)[ 可以在GitHub或者GitHub Pages上找到C Core Guidelines,查看详细内容。]
P.4:在理想情况下,程序应具有静态类型安全性(5.1节)
P.10:优先选择不可变数据而不是可变数据(5.2节)
P.11:将凌乱的构造封装起来,而不是使其散布于代码中(2.1节)
I.3:避免使用单例(3.2节)
I.11:切勿通过原生指针(T*)或引用(T&)转移所有权(3.1节)
I.23:尽量减少函数参数(2.2节)
I.26:使用C风格子集获取跨编译器的ABI(2.3节)
I.30:封装违反规则的部分(5.3节)
F.21:优先选择结构体或元组返回多个“输出”值(4.1节)
F.51:在有选择的情况下,优先使用默认参数而非重载(1.2节)
C.45:不要定义仅初始化数据成员的默认构造函数,而应该使用类内成员初始化(1.3节)
C.47:按声明的顺序定义并初始化成员变量(2.4节)
C.90:使用构造函数和赋值运算符,而不是memset和memcpy(3.3节)
C.131:避免平凡的get和set函数(1.4节)
Enum.3:优先选择class枚举而不是“普通”枚举(4.2节)
ES.5:保持作用域短小(4.3节)
ES.10:每条语句只声明一个名字(1.5节)
ES.22:初始值确定后再声明变量(5.4节)
ES.50:不要用强制转换去除const限定符(3.4节)
Per.7:为促成优化而设计(5.5节)
CP.3:尽量减少可写数据的显式共享(2.5节)
E.6:使用RAII防止泄漏(5.6节)
E.28:避免基于全局状态(如errno)的错误处理(3.5节)
Con.5:使用constexpr表示编译时可以计算的值(4.4节)
T.1:使用模板提高代码的抽象层次(4.5节)
T.10:为所有模板参数指定概念(4.6节)
T120:只在真正需要时使用模板元编程(2.6节)
SF.7:不要在头文件的全局作用域写using namespace(3.6节)
NR.2:不强求函数只用一条return语句(1.6节)
內容試閱
【推荐序一】
在数字化世界的无垠海洋中,每一串代码都如同一艘航船,载我们驶向未知与创新的港口。而C 这种兼具效率与灵活性的编程语言,宛如这片海洋中一颗耀眼的星。从诞生到今日,C 不仅见证了计算机科学由抽象理念到现实应用的壮丽变迁,更激发了程序员们对编程艺术的热爱与探索精神。
《C 之美》这本书就像一位智慧的导师,以其深邃且富有诗意的语言,带领我们遨游C 的瑰丽世界,挖掘隐藏在复杂编程结构和算法背后的美学。此书不仅是技术的教科书,还带领我们探索编程的本质和艺术,让我们在熟练掌握C 的同时,体会到编程本身的乐趣与成就感。
我,作为《C 之旅》一书的译者,同时也是拥有二十余年一线C 编程实战经验的程序员。在翻译和研读这些权威著作时,我深切感受到,作者们并非纸上谈兵,而是真正投身工程实践,对C 的细枝末节有着深刻而独到的见解。
这本《C 之美》汲取了C Core Guidelines的精髓,并结合了作者十多年行业实战经验。这些源于真实项目的宝贵经验,对于所有热爱C 的编程者来说,都是无价的财富。
我坚信,《C 之美》将成为每位C 爱好者的宝贵手册。它不仅会伴随你度过那些漫长的编程夜晚,更会在你迷茫之际,成为指引你前行的明灯。让我们共同启航,在《C 之美》的指引下,感受编程的纯粹与魅力,书写自己的编程传奇。
愿此书成为你编程之路上的灯塔,为你照亮通往更高成就的道路。
——@pansz 《C 之旅》(第3版)译者,知乎关注人数过百万答主
【推荐序二】
许多程序员在多年工作后,竟然一年都无法完整读完一本技术书。尽管他们一年内可以在知乎和各类社交媒体上阅读数百万字的内容,却无法读完一本仅有50万字的书。这并不是因为他们太忙、没有时间,而是因为人类天生就偏爱碎片化的快餐信息。然而,越是珍贵的东西,越需要付出努力才能获得,知识也不例外。不进行系统性的学习和深入的思考,是无法获得真正宝贵的知识的。
有些技能只要投入一定时间学习就能掌握,比如打字、驾驶、学习一门新的编程语言;而且一旦掌握它们,你就会终身受益。在这些事情上投入时间,性价比最高。
实话说,今天学习C 比以前更具挑战性了。一方面,新标准的引入提高了C 的安全性和描述力,但也增加了学习的难度;另一方面,过去大部分软件都用C 来开发,新人入职后通常先从小模块的开发开始,再逐步扩展到中模块、大模块,通过学习老同事的代码,在生产领域不断实践,总能一步一步提高编程能力,最终能设计较为复杂的大型系统。然而,如今的新人并没有这种阶梯式的锻炼机会,他们的第一语言往往不是C ,而当他们用其他语言开发几年后遇到性能瓶颈需要用C 时,突然根本无法驾驭。
同时,掌握C 也成为一项愈加珍贵的技能。新兴行业最初的各种基础设施和工具,大多是用C 构建的。无论是十多年前的移动开发领域,还是四五年前的音视频领域,乃至当下热门的AI领域,都是如此。例如TFLite、whisper.cpp和llama.cpp等这些都是C 项目,其中llama.cpp在GitHub上线两周内就获得了20,000个星标。同时精通C 和Python的算法工程师,相较于只会Python的程序员,能获得更多机会,走得更远。
关于C 语法的知识,自己花点儿时间总能学会,但在实际项目中积累经验与领悟却需要很长时间。不少人过于专注于穷尽语法的各个细节,却忽略了对大型复杂项目驾驭能力的培养,结果就是谈起C 标准来头头是道,在项目中写点儿复杂代码就垮了。
本书提炼和归纳了C 工程实践中的难点。我初读的感受很像是对过往认知的一次印证,不少准则让我很有共鸣,比如优先使用函数默认参数而非重载,尽量减少可写变量的显示共享等,这些建议在项目初期可能不会显得特别重要,但随着项目复杂度的增加,忽视它们所带来的问题才会逐渐显现出来。更隐蔽的是,当项目变得难以维护时,很多人可能无法意识到正是这些问题的积累导致了困境。
有些准则所描述的问题真的是多年的开发者才会遇到的“暗坑”,比如跨ABI需要使用C风格接口,优先选择不可变数据而不是可变数据,没有多年的C 编程经验是完全总结不出这些准则的。本书挑出的30条核心准则能帮助大家更好地驾驭大型复杂C 项目。如果说Effective C 总结了许多微观层面的“避坑”建议,那么本书则提供了一份宏观层面的“避坑”指南,特别适合在学习完语法,完成一两个玩具项目之后,真正开始做一些严肃项目时阅读。
——@韦易笑 资深游戏开发专家
【译者序】
C 不是一门简单的编程语言,这一点从相关的书籍上便可见一斑。首先,几乎每一本C 基础教程都是大部头;其次,仅关于惯用法和最佳实践就已经形成系列,而且出现了不少经典著作,比如Scott Meyers的“Effective”系列,Herb Sutter的“Exceptional”系列,以及其他一些单本,如C Gotchas、C Coding Standards等。
C 语言的发展从未停滞,最佳实践也随之发展。2014年,C 之父Bjarne Stroustrup和ISO C 标准委员会主席Herb Sutter共同编辑并维护了《C 核心准则》(C Core Guidelines),这无疑是现代C 最佳实践的集大成者。而且,它是一份动态文档,到本书定稿时,新的编辑意见仍在提交和合并中。
目前,《C 核心准则》分为近20个大类,包含的条目800有余,远远超过了以往任何一本最佳实践图书的内容。依其初衷,也限于篇幅,每个条目往往只说结论,外加简短的解释。
鉴于此,本书的两位作者从中精心挑选了30条核心准则,为读者做详细的解释。通过这种突出重点、以点带面的方式帮助读者了解并学习《C 核心准则》。书中的内容远不止理论上的分析和探讨,更包含了作者数十年职业生涯中的经验和示例,因此很多的深刻见解都是通过故事娓娓道出的。这样的方式既能将问题讲透,又使阅读的体验相对轻松。
30条准则在《C 核心准则》中所占的比例虽然很小,但讲解的内容涉及C 语言的各个主要方面,如类型系统、面向对象、模板和元编程、错误处理、性能、常量性,当然还有编码风格,甚至某些设计模式。很多时候,作者在讲解一条准则的时候也会引用其他的准则。
在翻译本书的过程中,我跟随作者的思路,不仅更深入地领会了《C 核心准则》,对随着各版新标准的推出而不断成长的现代C 语言也有了更多感悟。此外,在翻译的过程中,我也时常遇到自己工作中经常思考的问题,对作者的论述心有戚戚焉,但作者的总结更加通透。
倘若有幸,我的转达是有效的,相信读者朋友也能从中领略很多。若有表达不清之处,那一定是翻译的问题,希望朋友们不吝指正。
有幸翻译本书完全出于电子工业出版社张春雨老师的抬爱和信任,对此不胜感激。然而翻译的周期远远超出了最初的计划,导致图书未能及早付梓而到达读者手中,对此更应感谢所有编辑老师的谅解,也恳请读者朋友见谅。
——王江平 于上海
【序】
我很享受阅读本书的过程。我享受它,尤其因为它以一种与《C 核心准则》(C Core Guidelines,CG)本身完全不同的方式呈现了C 的核心准则。CG以一种固定格式,相对简短地给出了各条准则。在CG中,这些准则通常是用编程语言的术语表达的,强调如何通过静态分析来实施。本书却在讲故事,很多故事来自经历了几十年代码和技术演化的游戏行业。它以开发者的视角讲解这些准则,强调遵循这些准则将会得到的好处,以及无视这些准则可能导致的噩梦。关于准则的动机,相比CG本身所阐述的内容,在本书中有更加广泛的讨论。
CG旨在达到一定程度的完整性。当然,一套关于如何编写优良代码的准则难以达到彻底的完整性,而必要程度的完整性则意味着CG并不适合系统性阅读。我推荐各位阅读CG的前言和哲学部分,以了解其目标和概念框架。但是,如果要在品味、视角和经验的指导下有选择地了解CG,那就阅读本书吧。对真正的极客来说,本书是轻松有趣的读物。对大多数软件开发者来说,它提供了新的、有用的东西。
——Bjarne Stroustrup
【前 言】
随着每一版C 新标准的到来以及每一种新教程的出现,编写C 代码的复杂性逐渐降低。相关的会议、博客和书籍比比皆是,这是好事。世界上并没有足够多的高素质工程师来解决我们面临的实际问题。
尽管C 语言不断简化,但就如何编写好的C 代码而言,仍有很多东西需要学习。C 的发明者Bjarne Stroustrup和维护C 标准的机构的召集人Herb Sutter投入了大量精力来创作关于学习C 和编写更好的C 代码的教材。这些教材包括:The C Programming Language[ Bjarne Stroustrup著,Addison-Wesley出版。中文版名为《C 程序设计语言(第1-3部分)》(原书第4版),由机械工业出版社于2016年出版。]、A Tour of C [ Bjarne Stroustrup著,Addison-Wesley出版。中文版名为《C 之旅》(第3版),由电子工业出版社于2023年出版。],以及Exceptional C [ Herb Sutter 著,Addison-Wesley出版。同名中文版由电子工业出版社于2012年出版。]和C Coding Standards[ Herb Sutter与Andrei Alexandrescu合著,Addison-Wesley出版。中文版名为《C 编程规范》,由人民邮电出版社于2016年出版。]。
书的问题在于它代表的是事物发展的一种时间快照,本书也一样。然而C 是一门不断发展的语言,1998年的好建议拿到现在来看或许就不再是明智之举了。编程语言在不断发展,相应的准则也要不断发展。
在2015年的CppCon上,Bjarne Stroustrup[ 可以在YouTube上观看Bjarne Stroustrup的演讲视频,演讲题目为“Writing Good C 14“。]和Herb Sutter[ 可以在YouTube上观看Herb Sutter的演讲视频,演讲题目为“Writing Good C 14... By Default”。]在他们各自的主题演讲中都发布了一份在线文档——《C 核心准则》[ C Core Guidelines,版权所有者为Standard C Foundation及其贡献者。可访问isocpp.github.io网站获取。]。该准则为改善C 代码风格提供了出色而简单的建议。只要遵循这些建议,你从一开始就能写出正确且高效的C 代码。它是C 从业者所需要的指导手册,而且它本身也在不断改进,作者们都很乐意审阅那些提出修正或改进意见的拉取请求(pull request)。从C 初学者到老手,每个人都应该遵循这些建议。
2020年2月底,Kate Gregory在“#include C ”的Discord聊天组[ #include 是一个全球性、多元化、包容的C 开发者社区(网站名为includecpp)。社区的交流平台为其Discord服务器。]中表示打算写一本关于C 核心准则的书,我小心翼翼地抓住了这个机会。Kate在2017年的CppCon[ 可以在YouTube上观看Kate Gregory的演讲视频,演讲题目为“10 Core Guidelines You Need to Start Using Now”。]上做过一次演讲,其中只提到了《C 核心准则》中的10条。我和她一样,对推动程序设计向更好的方向发展满怀热情。我在英国成立时间最久、规模最大的游戏开发工作室Creative Assembly担任工程实践主管,在过去的20多年里,我花了很多时间帮助我们的优秀工程师成长为卓越的工程师。据我们观察,尽管《C 核心准则》简单易懂,但许多开发者对它并不是特别熟悉。我们想宣传那些准则,让更多人用起来,于是决定写这本书,因为相关的书还不够多。
《C 核心准则》里面都是非常好的建议,让人不知道从哪里开始看比较好。你可以从头读到尾,但需要反复阅读,否则很难掌握全部的内容。这些建议被分成22部分,冠以“接口”“函数”“并发”之类的标题。每一部分都是由一条条的准则组成的,有的部分有几条,有的部分则有几十条。每一条准则使用所属部分的标题首字母,加上它在这一部分中的编号来标识,中间用点号隔开。例如,“F.3: Keep functions short and simple”(F.3:保持函数简短)是“Functions”这一部分中的第3条准则。
每条准则都以相同的方式编排。首先是准则的标题。标题通常描述的是一种动作(这样做、不这样做、避免这样做、首选这样做等),然后是理由和一些示例,可能还有例外的情形。最后还有一条关于如何实施该准则的说明。说明的内容多种多样,有给静态分析工具开发者的建议,也有如何进行代码审阅的提示。事实上,阅读这些准则是有技巧的,而决定在自己的代码中优先考虑哪些准则属于个人发现(personal discovery)的范畴[ 译注:意思是在阅读和理解准则时应独立思考和判断。这里强调了准则的执行是一个因人而异的个体化的过程。]。我们希望传递关于如何利用核心准则的智慧。
C 中有一些尖锐的棱角,也有一些积灰的角落,它们在现代C 中不常出现。我们想让大家远离这些东西。我们想告诉你,C 不难用,也不复杂,它不是大多数开发者无法信任的语言。
【关于本书】
在本书中,我们列出了我们认为的最好的30条C 核心准则。通过详尽地解释这些准则,我们希望你至少能遵循这部分准则,哪怕你决定不去研究其他准则。我们选出的这部分准则不一定是最重要的,但它们一定能立即改善你的代码。当然,我们也希望你能意识到,还有很多其他的准则也应当遵循。我们希望你能阅读其余的准则,并在自己的代码中尝试。《C 核心准则》是写给各种水平的C 开发者的,本书也是如此。本书的内容并未按复杂程度递进,各章节也不必按某种顺序阅读。尽管有些章节可能明确引用了其他章节的内容,但各章节仍然是相互独立的。我们把每节的篇幅控制在3000字左右,因此你可能认为这是一本床头书而不是一本教科书。本书的目的不是教你学C ,而是就如何改进代码风格提出建议。
按照Kate在CppCon 2017上演讲的原始内容,我们将准则分为5章,每章有6节。在第1章“避重就轻不可取”[ 译注:原文是“Bikeshedding”,源于Northcote Parkinson的一段隐喻,下文有提及。隐喻中提到一个委员会在开会讨论财务预算时,花大量时间讨论建造自行车棚的项目,而对更复杂也更重要的核电厂项目却只花了很少的时间讨论。此处以成语“避重就轻”意译之。]中,我们提出了一些准则,方便你在一组特定的A和B选项中,轻松地决定何时选A而何时选B,尽可能减少无谓的争执,然后继续向前。“避重就轻”(Bikeshedding)[ 参阅网站exceptionnotfound上的文章“Bikeshedding—The Daily Software Anti-Pattern”。]源于C. Northcote Parkinson的“琐碎性定律”(law of triviality),即组织成员往往在讨论中过分关注一些琐碎的问题,比如更关注自行车棚要涂成什么颜色而不是与之毗邻的核电站的测试标准,虽然后者更重要,但对于前者,每个人都能说上两句。
在第2章“不要伤害自己”中,我们提出了在编写代码时防止“人身伤害”的准则。C 中残存的复杂性导致的问题之一是,在有些地方你很容易砸到自己的脚。例如,虽然以任意次序排列构造函数的初始化列表都是合法的,但随意排列绝非明智之举。
第3章名为“别再使用”,涉及C 中出于向后兼容而保留的内容,以及曾经有价值但因C 的发展而不再适用的建议。随着C 的发展,有些在当时看似不错的想法,我们发现其价值远低于最初的预期。标准化过程修正了这类问题,但你还是要了解它们,因为在面对遗留代码时,你还会遇到这类问题。C 保证了向后兼容——50年前用C语言写的代码今天应该还能编译。
第4章以“正确使用新特性”为题紧跟前一部分的内容。在使用概念(concept)、constexpr、结构式绑定(structured binding)等特性时需要格外注意。还是那句话,C 是不断发展的语言,每一个版本都会引入新特性,需要相应的教学内容来支持。尽管本书的目的不是教授C 20的新特性,但这些准则确实能让你体会到如何理解这些特性。
第5章的标题是“默认写出好代码”,里面讲的都是简单的准则,只要遵循它们就能写出好的代码,而不需要过多地考虑其他情况。这些准则将帮助你养成良好的习惯,而你写出的C 代码将易于理解并因此被他人欣赏。
正如一篇好文章一样,整本书的主题是逐渐浮现并展开的。发现准则背后的动机,并探索其更广泛的应用,这是我写这本书获得的乐趣,希望它也能转化为你阅读本书的乐趣之一。在适用的地方仔细观察时,你就会发现许多准则都是以不同的方式重申了软件工程的一些基本道理。提炼出这些道理,将大大改进你的编程实践。
我们真心希望大家喜欢本书并从中受益。

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 台灣用户 | 香港/海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.