C++ Core Guidelines是Bjarne和 Herb Sutter发起编写的一个开源项目,汇聚了 C++社区多年来积累的宝贵经验,是非常全面的编程最佳实践指导,包括代码风格、函数、类、错误处理、性能优化等,可以说是C++社区的集大成者。用Effective Modern C++的译者高博老师在《C++ Core Guidelines解析》推荐序中的话说,“学习C++而不了解 C++ Core Guidelines 相当于盲人摸象”。
前言
《C++ Core Guidelines解析》,书的译者以及推荐序都是鼎鼎有名的C++大师,比如活跃于知乎的C++大佬 @吴咏炜 ,比如张银奎先生,比如轮子哥。这强大的阵容以及书的名字,让人忍不住将它和《C++标准库》《C++ Primer》《C++编程思想》一块儿压在箱底。
C++ Core Guidelines详细阐述了Modern C++的编程思想,是C++创始人对C++代码编写的宏观指导,是一个语言级规范集合。内存(资源管理)、重载、模板……C++这门语言给了编程者极大的自由度,但如何编码实现,才更加高效、安全、规范?侯捷大师多次提到过“代码要大器、要有大家风范”,如何才能做到?这本书里给了很多建议,从接口、函数、类(层次结构)、枚举、表达式、模板、标准库,各个方面,C++ Core Guidelines给了详尽的规则指导和代码示例。
C++ Core Guidelines是 C++ 语言规范的补充,它提供了一系列关于编写高质量 C++ 代码的建议。这些建议涵盖了各种编程问题,包括内存管理、异常处理、类型安全、模板编程和泛型编程。 C++ Core Guidelines 由 C++ 标准委员会 (ISO/IEC JTC1/SC22/WG21) 维护,并由 C++ 社区的许多成员贡献。这些建议是经过广泛讨论和测试的,并且被认为是编写高质量 C++ 代码的最佳实践。
Core guidelines 的作者是 Bjarne Stroustrup,也即 C++ 的创始人,以及来自微软的 Herb Sutter,是标准会委员核心成员。C++ 专家讲师 Rainer Grimm提炼出了Core Guidelines中的精髓,去除了晦涩难懂的内容并出了本书,书的英文原名是《C++ Core Guidelines Explained: Best Practices for Modern C++》,by Rainer Grimm。
从 C++11 到最新的 C++23、C++2c,C++ 在不停引入新特性来提高语言的表达能力——但这不意味着语言更容易使用,因为为了尽可能维持与 C 的兼容性,大量旧的特性并没有积极地删除或弃用。因此,一个自称“C++ 程序员”的人,既可以紧跟标准版本,写出“good smell”的代码,也可以一直坚持 C 甚至 K & R C 的写法。显然后者并不是 C++ 设计者所期望的,因此他们起草这个小册子来告诉程序员们,C++ 应该如何使用,以利用 C++ 的所有现代的有用的特性。
我可以更激进地说,如果一个自称会 C++ 的人没有听说过 C++ Core Guidelines,那么我可以断定他在胡说八道。
github地址:CppCoreGuidelines/talks at master · isocpp/CppCoreGuidelines · GitHub
推荐理由
比如,我们常说尽量使用智能指针代替裸指针,从而避免内存的泄漏,但是这又造成另外一个问题一一智能指针的过度使用。C++ Core Guidelines中有这么一条建议——“对于一般用途,采用 T*或 T& 参数而不是智能指针”,因为智能指针关注所有权和生命周期,在不操作生命周期的函数中应该使用原始指针或引用。
C++ Core Guidelines 中有大量的建议是关于代码安全性的,例如使用条件变量的时候可能会发生虚假唤醒,应该使用谓词去 wait;全局的 lambda 不要按引用去捕获,以避免生命周期的问题;等等,这些对于实际的开发来说非常有指导价值。
除了规则和惯用法,C++ Core Guidelines 还会解释一些容易引起争论的话题。比如错误处理中的异常,Guidelines 中非常客观地描述了异常的应用场景,例如只有在能精确预测从throw 恢复的最长时间时,异常才适用于硬实时系统。此外,Guidelines 客观地提出,如果负担不起或者不喜欢基于异常的错误处理方式,那么也可以采取其他方案,但必须做充分的测试和测量,因为无论哪种错误处理方式都有其不同的复杂性和问题。
C++ Core Guidelines 比较好的一点是,它并不是教条地说要这样或者不要那样,而是会告诉你为什么这样更好,例比如为什么用std:array 而不是 C数组,因为 std:array 兼具了效率和安全性,访问越界的时候会抛异常,比 C 数组更安全。C++ Core guidelines的网址:https://github.com/isocpp/CppCoreGuidelines。
这些准则旨在帮助开发者编写出可读性好、可维护性高、可靠性强的C++代码。 其中一些核心准则包括:
1. 避免使用全局变量和静态变量,尽可能使用局部变量。
2. 使用引用传递函数参数,以减少函数调用开销。
3. 使用const修饰符来表示不会修改的变量,以增加代码的可读性。
4. 使用RAII技术来管理资源,以确保资源的释放。
5. 使用模板实现通用代码,以提高代码的重用性。
6. 避免使用多个返回值,可以使用对象组合来代替。
7. 使用异常处理来处理错误,以避免返回错误码。
8. 使用智能指针来管理动态对象,以避免内存泄漏。 这些准则的详细解释和用法可以在C++ Core Guidelines的官方文档中找到。遵循这些准则可以提高C++代码的质量和可维护性。
在《C++ Core Guidelines 解析》中,C++ 专家讲师 Rainer Grimm提炼出了Core Guidelines中的精髓,去除了晦涩难懂的内容,分享了新的见解和背景,并提供了自己培训课程中经过充分测试的示例。
对于使用 C++11 及后续版本 C++ 的有经验程序员,Grimm 能为他们提供帮助,使其用好Core Guidelines。他的大部分代码示例是为 C++17 编写的,在合适的地方涵盖了更新版本和 C++20,并提供了对官方 C++ Core Guidelines在线版本的引用。
无论你是创建新软件还是改进旧代码,Grimm 都将帮助你从Core Guidelines里最有用的规则中获取更多价值,使你编写的代码更安全、更清晰、更高效,以及更易于维护。
* 应用Core Guidelines和其中的编程哲学
* 正确使用接口、函数、类、枚举、资源、表达式和语句
* 优化性能,实现并发和并行,处理错误
* 有效地使用常量、不可变性、模板、泛型和元编程
* 改进C++ 代码风格,管理源文件,使用标准库
最后提示一下这本书的正确阅读姿势(摘自译者序):
-
按本书附录 A 的线索,在工作和学习环境中启用相关的自动检查,马上开始在代码设计和审核流程中使用。
-
花一两天的时间快速遍历 C++ Core Guidelines 的关键条目。该指南会一直动态更新,而本书提供了一个相对稳定的切片,更方便读者快速把握基本要点。
-
当需要细究具体条目或某方面的规则时,比如在代码审核中对同一条目有理解不一致的地方时,仍要参考 C++ Core Guidelines 的英文原文。
-
C++ Core Guidelines 和本书并没有深入探讨条目背后的技术史和设计哲学。读者如果希望在这些方面进一步探究,可以参阅另一本“姊妹作品”Beautiful C++:30 Core Guidelines for Writing Clean, Safe, and Fast Code 及其作者 Kate Gregory女士在 CppCon 2017 的演讲,也可参考 C++ Core Guidelines 列出的参考文献。
-
C++ Core Guidelines 反映了 C++ 社区的公约数,但未必完美符合具体 C++ 团队在业务背景、技术选型和设计风格上的共识。读者在工程实践中,可以根据自己团队及项目的情况扩展或者改写某些条目,从而生成更适合自己和团队的技术指南。
其他资源
《C++ Core Guidelines 解析》 - 知乎
好书推荐:《C++核心指南解析》 - 知乎
C++ Tutorial (tutorialspoint.com)
【摘要】Cpp核心指南_cppcoreguidelines_Rilakkuma的博客-CSDN博客
https://www.eet-china.com/mp/a252711.html
《C++ Core Guidelines解析》:揭示现代C++最佳实践的深层原理_c++_热爱跑步的恒川-华为云开发者联盟
首页-第2学堂
Yongwei’s Blog