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

來源:互聯網
上載者:User

原文地址: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 指標常量(比如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<>());

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.