AtomicObject 团队在他们的网站上很好地描述了 C++ 的“丰富性”所带来的危险:
C++ 是一门极其丰富的语言。这种丰富既是福音,也是诅咒。说它是福音,是因为它强大的表达力和对多种编程范式的支持;说它是诅咒,是因为这种丰富意味着复杂,需要掌握的东西太多。C++ 是一门可以伴随您成长的语言,每一次使用都能让您学到新特性或有更深的理解。由于 C++ 的每个特性都可能与其他特性相互作用,学习 C++ 就像是在逐步填满一张由 C++ 特性向量与其自身的叉积构成的、并不算稀疏的知识矩阵。手边没有好的参考资料,就不应认真地使用这门语言。
自 2011 年以来,微软在许多文章中宣告了 C++ 的回归,Herb Sutter 等微软 C++ 专家也做了许多演讲,解释 C++ 为何回归,并主要推荐现代 C++ 的用法。与此同时,C++11 标准获得批准,人们开始把 C++ 当作一门新语言来谈论。
然而,在 2011 年,C++ 已有 30 多年的历史。要让开发者相信新的 C++ 简化了许多令人沮丧的旧用法、并且已经有了一种改善 C++ 代码的现代方式,并不容易。
但遗憾的是,活跃的 C++ 社区和知名专家们的所有努力仍然不够。这个故事的寓意是:如果您给某人用一门语言或一个工具做某件事的可能性,就不要惊讶于他们真的去做了。
今天,我们需要一些防护机制来帮助开发者编写整洁的 C++ 代码。
1. 一种受保护的编译器模式,只使用语言的一个子集
为了受益于标准委员会和 C++ 社区付出的巨大努力,我们需要能让我们排除某些旧 C++ 特性的编译器。
诚然,在使用现有 C++ 库时这是一个很大的约束,但如果我们相信 C++ 还会有很长的生命力,就需要现在就开始为向现代 C++ 过渡做准备。
现有编译器并非为“只接受语言标准的某个子集”而设计。不过,在 CppDepend 中把 Clang 用作解析器之后,我们可以确认:它的模块化、实现方式以及强大的诊断功能,可以帮助其贡献者开发出一个能通过命令行轻松定制的版本,在编译源代码时排除 C++ 标准中的某些旧特性。
2. 编译器诊断与警告
我们需要更多的诊断和警告来报告已弃用的用法。Clang 已经能报告许多与弃用用法相关的有趣诊断,也许将来它还会提供这样的可能:当报告了某些特定诊断时中止构建。
3. 工具
一些工具可以帮助我们检测弃用用法,而且它们可以集成到构建流程中,在违反某些规则时让构建失败。
Clang-Tidy 是一个检测众多缺陷和弃用用法的强大工具。CppDepend在 2017 版本中集成了它,同时还提供了一种代码查询语言,可以像查询数据库一样查询代码,让您轻松定制编码规则并检测弃用用法。
简而言之,我们需要更好的解决方案,帮助 C++ 开发者过渡到现代 C++。
