天天看點

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

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:

git clonehttp://llvm.org/git/clang-tools-extra.gitextra

這個文檔描述了工程内部的Clang工具的高層次組織的簡介,同時介紹了這些工具中更重要的幾個。然而,需要注意的是,這個文檔隻是針對Clang和Clang工具的開發者,不是這些工具的最終使用者。

Clang工具是為了讓C++開發者可以直接使用的指令行或者圖形界面程式。它們最初不是為了給Clang的開發者使用的,盡管希望它們可以對恰巧工作在Clang的C++開發者有很大幫助,我們積極擴充他們的功能。它們被作為三個部分進行開發:基于Clang而建構的一個單獨工具的基礎設施;被很多不同的工具所使用的核心共享邏輯,這些工具是以重構和重寫庫的形式出現的;工具本身。

Clang工具的基礎設施是LibTooling平台。可以從它的文檔中看到更多關于它的架構如何工作的細節。重構和重寫的工具包風格的庫的共同之處也是LibTooling組織的一部分。

幾乎沒有Clang工具是和核心的Clang庫,像基本功能和測試用例那樣一起開發。然而,大多數的工具就在邊上的代碼庫(不在項目的代碼庫)上開發就是為了證明它們其實就是簡單的從核心庫中分離。我們沒打算支援很多不在項目代碼庫的公共庫,我們想很細心的複審和查找好的庫的接口,然後把它們從那些庫裡放到核心Clang庫系列。

無論Clang的工具的代碼放在哪個代碼庫中,所有的Clang工具的開發過程和實踐都是Clang本身的。它們都是Clang項目的一部分,無論使用什麼樣的版本控制體系。

Clang工具的核心系列是在主工程之内的,完成程度已經非常高,并且允許使用和進行Clang的特定功能測試。

Clang-format既是一個庫,也是一個單獨的工具,它的目标是根據認證的風格指引去自動格式化C++源碼檔案。為了達到這個目标,clang-format使用Clang的Lexer去把一個輸入檔案轉換為一個token流,然後改變這些token周圍的的所有空格。clang-format的這個目标是既要可以作為一個使用者工具(理論上擁有強大的IDE內建),同時又要作為其它重構工具的一部分,比如:在重命名的時候去格式化所有改變的行。

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

把循環轉化為基于範圍的for循環;

把空指針常量(比如NULL或者0)轉換為C++11的nullptr;

用auto類型說明符替換變量聲明中的類型說明;

在适當的成員函數上添加override說明;

不同種類的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轉換器聯合起來。它将可以轉換:

變為:

tr1去除工具。它将使用TR1庫的源碼遷移到使用C++11的庫。例如:

應該被重寫為:

一個去除auto工具。将把auto轉換為一個明确的類型或者添加推斷的類型到注釋裡。這個工具的動機是因為有開發者不想去使用auto,他們害怕會讓他們的代碼失控。

繼續閱讀