使用 Clang Tools —— 概述

概述

      • 1. Clang Tools 组织
      • 2. 核心 Clang Tools
          • 2.1 clang-check
          • 2.2 clang-format
      • 3. 扩展 Clang Tool
          • 3.1 clang-tidy
      • 4. 新工具的想法

本文为译文,点击 此处查看原文。

Clang Tools是为 C++ 开发人员设计的独立命令行(可能还有GUI)工具,这些开发人员已经在使用 Clang 作为他们的编译器,并且很喜欢 Clang。这些工具提供面向开发人员的功能,如快速语法检查(fast syntax checking)自动格式化(automatic formatting)重构(refactoring)等。

只有几个最基础和最根本的的工具保存在主 Clang 树中。其余的工具保存在一个单独的目录树中,称为 clang-tools-extra。

本文档描述了项目中Clang Tools组织的高级概述,并介绍了一些更重要的工具。但是,应该注意的是,本文目前关注的是ClangClang 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_castconst_castreexplt_cast)。

  • 非成员begin()end()转换工具。将foo.begin()转换为begin(foo),类似地用于end(),其中foo是一个标准容器。我们还可以为数组检测类似的模式。

  • tr1删除工具。将源代码从使用TR1库特性迁移到C++11库。例如:

    #include 
    int main()
    {
        std::tr1::unordered_map <int, int> ma;
        std::cout << ma.size () << std::endl;
        return 0;
    }
    

    应改写为:

    #include 
    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<>());
    

你可能感兴趣的:(Clang)