天天看点

使用 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

组织的高级概述,并介绍了一些更重要的工具。但是,应该注意的是,本文目前关注的是

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)。例如:

    应改写为: