原文地址: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<>());