概述
本文为译文,点击 此处查看原文。
Clang Tools
是为 C++ 开发人员设计的独立命令行(可能还有GUI)工具,这些开发人员已经在使用 Clang 作为他们的编译器,并且很喜欢 Clang。这些工具提供面向开发人员的功能,如快速语法检查(fast syntax checking)
、自动格式化(automatic formatting)
、重构(refactoring)
等。
只有几个最基础和最根本的的工具保存在主 Clang 树中。其余的工具保存在一个单独的目录树中,称为 clang-tools-extra。
本文档描述了项目中Clang Tools
组织的高级概述,并介绍了一些更重要的工具。但是,应该注意的是,本文目前关注的是Clang
和Clang Tool
开发人员,而不是这些工具的最终用户。
1. Clang Tools 组织
Clang Tools
是 CLI 或 GUI 程序,它们计划被 C++ 开发人员直接使用。也就是说,它们主要不是为 Clang 开发人员所使用的,尽管它们对碰巧在 Clang 上工作的 C++ 开发人员很有用,而且我们试图积极地利用它们的功能。它们由三个组件开发:用于构建基于 Clang 的独立工具的底层基础设施、许多不同工具以重构和重写库的形式使用的核心共享逻辑,以及工具本身。
Clang Tools
的底层基础设施是 LibTooling 平台。有关此基础设施如何工作的更详细信息,请参阅其文档。公共重构和重写 toolkit-style 库也是 LibTooling 组织的一部分。
一些Clang Tools
是沿着核心 Clang 库开发的,作为基本功能的示例和测试用例。但是,大多数工具都是在一个分支存储库(side repository)中开发的,以便与核心库轻松分离。我们故意不支持分支存储库中的公共库,因为我们希望在库从一些工具中提取并进入核心 Clang 库集中时,仔细检查并为库找到好的 APIs。
不管Clang Tools
的代码位于哪个存储库中,所有Clang Tools
的开发过程和实践都完全是 Clang 本身的开发过程和实践。它们完全在 Clang 项目中,不管版本控制方案如何。
2. 核心 Clang Tools
主存储库中的Clang Tools
的核心集是非常具体的补充工具,并允许使用和测试 Clang 特定功能。
2.1 clang-check
ClangCheck 将运行一个 Clang tool 的LibTooling
框架与基本 Clang 诊断相结合,通过在一个快速的命令行界面中语法检查特定的文件。它还可以接受 flags,以便用不同的 flags 以不同的格式重新显示诊断信息,适用于驱动一个 IDE 或编辑器。此外,它还可以在修复模式(fixit-mode)下被使用,以直接应用 clang 提供的修复提示(fixit-hints)。有关如何设置和使用clang-check
的说明,请参见如何为 LLVM 设置 Clang Tooling。
2.2 clang-format
Clang-format
既是一个库,也是一个独立的工具,其目标是根据可配置的样式指南自动重新格式化 C++ 源文件。为此,clang-format
使用 Clang 的 Lexer
将一个输入文件转换为一个 token 流,然后更改这些 tokens 周围的所有 white space。目标是clang-format
既作为一个用户工具(理想情况下是使用功能强大的 IDE 集成),也可以作为其他重构工具的一部分,例如在一个重命名期间更改的所有行进行重新格式化。
3. 扩展 Clang Tool
随着各种Clang Tools
类别被添加到扩展的存储库(extra repository)中,将在这里跟踪它们。本文档的重点是用于其他工具开发人员的 tools 的范围和特性;每个工具都应该提供自己的以用户为中心的文档。
3.1 clang-tidy
clang-tidy
是一个基于 clang 的 C++ linter 工具。它提供了一个可扩展的框架,用于构建基于编译器的静态分析,检测和修复容易出现bug的模式、性能、可移植性和可维护性问题。
4. 新工具的想法
-
C++ 转换工具。将 C-style 的强制转换(
(type) value
)转换为适当的 C++ 强制转换(static_cast
、const_cast
或reexplt_cast
)。 -
非成员
begin()
和end()
转换工具。将foo.begin()
转换为begin(foo)
,类似地用于end()
,其中foo
是一个标准容器。我们还可以为数组检测类似的模式。 -
tr1
删除工具。将源代码从使用TR1
库特性迁移到C++11
库。例如:#include <tr1/unordered_map> int main() { std::tr1::unordered_map <int, int> ma; std::cout << ma.size () << std::endl; return 0; }
应改写为:
#include <unordered_map> int main() { std::unordered_map <int, int> ma; std::cout << ma.size () << std::endl; return 0; }
-
移除
auto
的一个工具。将转换auto
为一个显式类型或添加带有推导类型的注释。这样做的动机是,有些开发人员不想使用auto
,因为他们担心对代码失去控制。 -
C++ 14:更简洁的操作符函数对象(N3421)。例如:
sort(v.begin(), v.end(), greater<ValueType>());
应改写为:
sort(v.begin(), v.end(), greater<>());