Using Clang Tools----Overview(使用Clang工具----简介)

简介: 原文地址:http://clang.llvm.org/docs/ClangTools.html 译者:史宁宁(snsn1984) 简介 Clang工具是为C++开发者所设计的单独的命令行(潜在的图形界面)工具,这些开发者是已经使用Clang并且喜欢使用Clang作为他们的编译器。

原文地址:http://clang.llvm.org/docs/ClangTools.html

译者:史宁宁snsn1984

简介


Clang工具是为C++开发者所设计的单独的命令行(潜在的图形界面)工具,这些开发者是已经使用Clang并且喜欢使用Clang作为他们的编译器。这些工具提供了面向开发的功能:语法检查,自动格式化,重构等。

只有少数几个最基本和基础的工具被保留在Clang的SVN工程里。剩下的工具都被保存在边上其他的工程里,因为有些用户不想要或者不需要构建他们。如果你想进入额外的Clang工具代码库,简单的把他们下载到你的Clang的工具目录,然后采用平常所使用的构建过程去和有关联的LLVM/Clang代码一起构建:

  • With Subversion:
    • cd llvm/tools/clang/tools
    • svn cohttp://llvm.org/svn/llvm-project/clang-tools-extra/trunk extra
  • Or with Git:
    • cd llvm/tools/clang/tools
    • git clonehttp://llvm.org/git/clang-tools-extra.gitextra

这个文档描述了工程内部的Clang工具的高层次组织的简介,同时介绍了这些工具中更重要的几个。然而,需要注意的是,这个文档只是针对Clang和Clang工具的开发者,不是这些工具的最终用户。

Clang工具的组织

Clang工具是为了让C++开发者可以直接使用的命令行或者图形界面程序。它们最初不是为了给Clang的开发者使用的,尽管希望它们可以对恰巧工作在Clang的C++开发者有很大帮助,我们积极扩展他们的功能。它们被作为三个部分进行开发:基于Clang而构建的一个单独工具的基础设施;被很多不同的工具所使用的核心共享逻辑,这些工具是以重构和重写库的形式出现的;工具本身。

Clang工具的基础设施是LibTooling平台。可以从它的文档中看到更多关于它的架构如何工作的细节。重构和重写的工具包风格的库的共同之处也是LibTooling组织的一部分。

几乎没有Clang工具是和核心的Clang库,像基本功能和测试用例那样一起开发。然而,大多数的工具就在边上的代码库(不在项目的代码库)上开发就是为了证明它们其实就是简单的从核心库中分离。我们没打算支持很多不在项目代码库的公共库,我们想很细心的复审和查找好的库的接口,然后把它们从那些库里放到核心Clang库系列。

无论Clang的工具的代码放在哪个代码库中,所有的Clang工具的开发过程和实践都是Clang本身的。它们都是Clang项目的一部分,无论使用什么样的版本控制体系。

核心Clang工具

Clang工具的核心系列是在主工程之内的,完成程度已经非常高,并且允许使用和进行Clang的特定功能测试。

clang-check

ClangCheck联合了运行一个Clang工具所需的LibTooling框架和对特定的文件进行快速的语法检查的Clang诊断,使用的是命令行接口。它也可以通过接受不同的标志来显示不同格式的输出,适合用来驱动IDE或者编辑器。此外,它能在修复模式下直接使用Clang提供的修复提示。可以从文档How To Setup Clang Tooling For LLVM中去查找如何去建立和使用clang-check的命令。

clang-format

Clang-format既是一个库,也是一个单独的工具,它的目标是根据认证的风格指引去自动格式化C++源码文件。为了达到这个目标,clang-format使用Clang的Lexer去把一个输入文件转换为一个token流,然后改变这些token周围的的所有空格。clang-format的这个目标是既要可以作为一个用户工具(理论上拥有强大的IDE集成),同时又要作为其它重构工具的一部分,比如:在重命名的时候去格式化所有改变的行。

cpp11-migrate

cpp11-migrate 迁移C++的代码去在合适的地方使用C++11的特性。目前它可以:


  • 把循环转化为基于范围的for循环;
  • 把空指针常量(比如NULL或者0)转换为C++11的nullptr;
  • 用auto类型说明符替换变量声明中的类型说明;
  • 在适当的成员函数上添加override说明;

额外的Clang工具

不同种类的Clang工具被添加到额外的代码库中,它们将在这里被跟踪记录。这个文档的焦点是对于其他工具开发者来说的工具范围特征,每一个工具都应该提供它自己的聚焦用户的文档。

新工具的思路:


  • C++ cast转换工具。将可以把C风格的casts((type)value) 转换为C++ cast(static_cast,const_cast orreinterpret_cast)。
  • 无成员的begin()和end()转换工具。将可以转换foo.begin()为begin(foo),end()也是同样的,这里的foo是一个标准容器。我们也会探测数组的相似的模式。
  • make_shared /make_unique转换。这个转换器的一部分可以和auto转换器联合起来。它将可以转换:

    std::shared_ptr<Foo> sp(new Foo);
    std::unique_ptr<Foo> up(new Foo);
    
    func(std::shared_ptr<Foo>(new Foo), bar());
    

    变为:

    auto sp = std::make_shared<Foo>();
    auto up = std::make_unique<Foo>(); // In C++14 mode.
    
    // This also affects correctness.  For the cases where bar() throws,
    // make_shared() is safe and the original code may leak.
    func(std::make_shared<Foo>(), bar());
    
  • 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<>());
    
目录
相关文章
|
机器学习/深度学习 网络协议 Java
聊聊 wireshark 的重传包和重复包(Duplicate Packets or TCP Retransmissions?)
聊聊 wireshark 的重传包和重复包(Duplicate Packets or TCP Retransmissions?)
|
6月前
|
JSON 运维 Ubuntu
在Docker上部署Ollama+AnythingLLM完成本地LLM Agent部署
通过以上步骤,您可以成功在Docker上部署Ollama和AnythingLLM,实现本地LLM Agent的功能。在部署过程中,确保环境和配置正确,以避免不必要的问题。希望本文能够帮助您顺利完成部署,并在本地环境中高效地使用LLM模型。
1684 8
|
8月前
|
存储 缓存 运维
“网”罗天下,一键搞定:netsh命令的花式玩法与超实用攻略
`netsh`是Windows系统中强大的网络配置和管理工具,支持本地或远程修改网络设置。常用功能包括:显示和配置网络接口、无线网络管理、防火墙规则设置、网络配置备份与还原、远程管理等。通过`netsh`命令,用户可以轻松管理IP地址、启用/禁用网络接口、添加或删除无线网络配置文件、配置防火墙规则,并进行网络故障排查。掌握这些命令能大幅提升网络管理和维护效率。
765 11
|
9月前
|
敏捷开发 监控 数据可视化
实现SMART目标的工具有哪些?推荐5款适合团队和企业的目标管理工具
本文介绍了5款高效工具,包括Banli Kanban、Wrike、Airtable、Targetprocess和Basecamp,它们均能有效支持企业实现SMART目标的设定与管理。这些工具通过任务管理、进度跟踪、团队协作等功能,帮助企业确保目标的具体性、可衡量性、可达成性、相关性和时限性,提升工作效率和目标达成率。选择合适的工具需考虑企业的具体需求和规模。
实现SMART目标的工具有哪些?推荐5款适合团队和企业的目标管理工具
|
9月前
|
数据安全/隐私保护
思科模拟器Cisco Packet Tracer 8.2.1注册、下载和安装教程(正确+详细)
本文详细总结了思科模拟器Cisco Packet Tracer 8.2.1注册、下载和安装教程(正确+详细),看这一篇就够啦~
24705 5
思科模拟器Cisco Packet Tracer 8.2.1注册、下载和安装教程(正确+详细)
|
机器学习/深度学习 人工智能 搜索推荐
人工智能在医疗领域的伦理困境与未来展望
【8月更文挑战第10天】本文深入探讨了人工智能技术在医疗领域应用中所面临的伦理挑战,并展望了其未来的发展趋势。通过分析AI在提高诊断准确性、个性化治疗和药物研发等方面的积极作用,同时指出了数据隐私、责任归属和机器偏见等伦理问题,文章旨在促进对AI技术在医疗领域应用的全面理解和审慎态度。
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
385 0
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
1074 0
|
C# 开发者 Windows
WPF/C#:ProgressBar的基本使用
WPF/C#:ProgressBar的基本使用
222 0
|
自然语言处理 Dubbo 搜索推荐
又一国产开源项目走向世界,百度RPC框架Apache bRPC正式成为ASF顶级项目
Apache bRPC的前身是百度内部的一个RPC框架,采用C++语言编写,号称工业级别,在百度内部众多基础和业务系统中得到大规模的应用,是属于实战出来的,有很好的落地效果和&quot;底子&quot;。
811 0