複製鏈接
請複製以下鏈接發送給好友

Doxygen

鎖定
Doxygen是一種開源跨平台的,以類似JavaDoc風格描述的文檔系統,完全支持C、C++、Java、Objective-CIDL語言,部分支持PHP、C#。註釋的語法與Qt-Doc、KDoc和JavaDoc兼容。Doxygen可以從一套歸檔源文件開始,生成HTML格式的在線類瀏覽器,或離線的LATEX、RTF參考手冊。
中文名
Doxygen
屬    性
文件產生工具
產生文件步驟
三步
程序語言
C/C++Java Objective-C
文件格式
* HTML* XML* LaTeX

Doxygen工具介紹

Doxygen 是一個程序的文件產生工具,可將程序中的特定註釋轉換成為説明文件。通常我們在寫程序時,或多或少都會寫上註釋,但是對於其它人而言,要直接探索程序裏的註釋,與打撈泰坦尼克號同樣的辛苦。大部分有用的註釋都是屬於針對函數、類型等等的説明。所以,如果能依據程序本身的結構,將註釋經過處理重新整理成為一個純粹的參考手冊,對於後面利用您的程序代碼的人而言將會減少許多的負擔。不過,反過來説,整理文件的工作對於您來説,就是沉重的負擔。
對於未歸檔的源文件,也可以通過配置Doxygen來提取代碼結構。或者藉助自動生成的包含依賴圖(includedependency graphs)、繼承圖(inheritance diagram)以及協作圖(collaborationdiagram)來可視化文檔之間的關係。Doxygen生成的幫助文檔的格式可以是CHM、RTF、PostScript、PDF、HTML和Unixman page等。
一個好的程序設計師,在寫程序時,都會在適當的地方加上合適的註釋。如果,能夠在撰寫註釋時,稍微符合某種格式,接着就可以透過一個工具程序依據程序結構及您的批註產生出漂亮的文件。這將令許多工作繁重的程序設計師有時間多喝幾杯咖啡。
Doxygen 就是這樣的一個工具。在您寫批註時,稍微按照一些它所制訂的規則。接着,他就可以幫您產生出漂亮的文件了。因此,Doxygen 的使用可分為兩大部分。首先是特定格式的批註撰寫,第二便是利用Doxygen的工具來產生文件。

Doxygen程序語言

* C/C++
* Java
* Objective-C
* IDL (Corba, Microsoft及KDE-DCOP類型)
* Fortran
* VHDL
* PHP
* C#

Doxygen文件格式

* XML
* LaTeX
* RTF (MS-Word)
* Unix Man Page
而其中還可衍生出不少其它格式。如有了LaTeX 文件後,就可以透過一些工具產生出PS或是PDF檔案。
在多國語言的支持方面,Doxygen 目前可支持的約有2,30種。自Doxygen 1.2.16開始支持繁體中文。所以在目前一些Open Source 的程序文檔管理器中,Doxygen 算是相當完整的一套。在程序語言處理上面,Doxygen也算是少數在Borland C++Builder 的語法下還能夠正常運作的工具之一。
本文的目的是希望在經過仔細閲讀本文之後能夠給大家一個概略性的瞭解。以便可以很容易的上手使用Doxygen。至於Doxygen本身的詳細使用,各位可以參考隨着Doxygen 所附的文件。實際上,Doxygen 自己的使用手冊就是使用Doxygen 產生的。您可以看到他實際上能夠產生遠比Reference Book更復雜的文件。

Doxygen安裝

Doxygen 的安裝可説十分的簡單,本文僅介紹binary檔案的安裝,若您有興趣從source code重新compile起來,請自行查閲參考手冊。
首先,請您先至doxygen 的網站上面抓取最新版本的doxygen 回來。目前,只要您是Linux, Solaris, Mac OS X, HP-UX, 甚至是UnixWare,都有compile好的binary版本可以抓取。如果是Windows 95/98/ME/NT/2000/XP,甚至還有Setup的版本可以抓取。所以安裝過程可説十分簡單。只要給予正確的安裝目錄,相信一般在安裝上是不會遇到什麼問題的。
另外,如果您是Linux或是Windows,可以另外抓取Doxygen Wizard的程序。這是一個輔助工具,可以很快的幫您建立一個Doxygen 的組態檔案。透過這個組態檔案,您就可以很快的將文件產生出來。另外,若沒有使用Doxygen Wizard,還是可以使用一般的文字編輯器將這個組態檔製作出來。
若安裝成功,您應該可以看到doxygen 這個執行文件出現在您的系統中。若是Windows 平台,則可看到在程序集中有Doxygen 這個Folder出現。

Doxygen組態

Doxygen 產生文件可以分為三個步驟。一是為Project 建立組態檔,二是在程序代碼中加上符合Doxygen所定義批註格式。三是使用Doxygen來產生批註。
因此,第一步就是為您的Project 製作Doxygen 的組態檔案。這個所謂的組態檔案,格式其實也很簡單。就是一些Key 與值的設定。每個設定為一行。若第一行開頭為"#" 表示該行為批註。Doxygen 會忽略它。每個設定行的格式有兩種,分別如下:
TAG = value [value, ...]
TAG += value [value, ...]
第一種形式是最常見的,也就是要設定一個TAG (也就是一個Key ),他的值為右邊所定義的部分。原則上每個值都是單一的英文字,如果您要定義的值有空格符包含在內,可使用雙引號將它括住。如果要定義的值超過一個以上,可使用逗號","予以分隔開來。
如果您要定義的TAG 是屬於表列型態的,也就是他會有很多的值分別以逗號隔開。在Doxygen 組態檔中允許您在不同的地方重複定義。只是後面的定義應使用上面所説的第二種形式。此種形式會將前後兩個定義的值合併在一起。
知道這個基本格式後,剩下就是根據各個TAG 的意義來進行設定。關於TAG 的定義很多,此處我們僅針對必要用到的TAG 進行説明,剩下的部分請自行翻閲使用説明。
由於Doxygen 的TAG 還算不少,為了方便使用,Doxygen 自身提供了一個方便的選項,可以幫您建立一份空白的Doxygen檔案(Doxygen 是Doxygen 預設的組態檔名)。
> doxygen Doxygen
透過這個命令,您可以得到一個Doxygen 檔案,接下來就可使用一般的文字編輯器來進行編輯。
下面將針對幾個必要的TAG 進行説明:
PROJECT_NAME Project 的名字,以一個單字為主,多個單字請使用雙引號括住。
PROJECT_VERSION
Project的版本號碼。
OUTPUT_DIRECTORY
輸出路徑。產生的文件會放在這個路徑之下。如果沒有填這個路徑,將會以目前所在路徑來作為輸出路徑。
OUTPUT_LANGUAGE
輸出語言。預設為English。1.2.16 版後,您可以使用Chinese-Traditional 來輸出中文繁體的格式。
INPUT
指定加載或找尋要處理的程序代碼檔案路徑。這邊是一個表列式的型態。並且可指定檔案及路徑。舉例來説若您有a.c, b.c, c.c 三個檔案。您可使用INPUT = a.c, b.c, c.c 的方式。若您給定一個目錄,該目錄下面所有檔案都會被處理。
FILE_PATTERNS
如果您的INPUT Tag 中指定了目錄。您可以透過這個Tag來要求Doxygen在處理時,只針對特定的檔案進行動作。例如:您希望對目錄下的擴展名為.c, .cpp及.h的檔案作處理。您可設定FILE_PATTERNS = *.c, *.cpp, *.h。
RECURSIVE
這是一個布爾值的Tag,只接受YES或NO。當設定為YES時,INPUT所指定目錄的所有子目錄都會被處理。
EXCLUDE
如果您有某幾個特定檔案或是目錄,不希望經過Doxygen處理。您可在這個Tag中指定。
EXCLUDE_PATTERNS
類似於FILE_PATTERNS的用法,只是這個Tag是供EXCLUDE所使用。
SOURCE_BROWSER
如果設定為YES,則Doxygen會產生出源文件的列表,以供查閲。
INLINE_SOURCES
如果設定為YES ,則程序代碼也會被嵌入於説明文件中。
ALPHABETICAL_INDEX
如果設定為YES,則一個依照字母排序的列表會加入在產生的文件中。
GENERATE_HTML
若設定為YES ,就會產生HTML版本的説明文件。HTML文件是Doxygen預設產生的格式之一。
HTML_OUTPUT
HTML文件的輸出目錄。這是一個相對路徑,所以實際的路徑為OUTPUT_DIRECTORY加上HTML_OUTPUT。這個設定預設為html
HTML_FILE_EXTENSION
HTML文件的擴展名。預設為.html。
HTML_HEADER
要使用在每一頁HTML文件中的Header。如果沒有指定,Doxygen會使用自己預設的Header。
HTML_FOOTER
要使用在每一頁HTML文件中的Footer。如果沒有指定,Doxygen會使用自己預設的Footer。
HTML_STYLESHEET
您可給定一個CSS 的設定,讓HTML的輸出結果更完美。
GENERATE_HTMLHELP
如設定為YES,Doxygen會產生一個索引文件。這個索引文件在您需要製作windows 上的HTML格式的HELP檔案時會用的上。
GENERATE_TREEVIEW
若設定為YES,Doxygen會幫您產生一個樹狀結構,在畫面左側。這個樹狀結構是以JavaScript所寫成。所以需要新版的Browser才能正確顯示。
TREEVIEW_WIDTH
用來設定樹狀結構在畫面上的寬度。
GENERATE_LATEX
設定為YES 時,會產生LaTeX 的文件。不過您的系統必需要有安裝LaTeX 的相關工具。
LATEX_OUTPUT
LaTeX文件的輸出目錄,與HTML_OUTPUT用法相同,一樣是指在OUTPUT_DIRECTORY之下的路徑。預設為latex
LATEX_CMD_NAME
LaTeX程序的命令名稱及檔案所在。預設為latex。
GENERATE_RTF
若設定為YES ,則會產生RTF 格式的説明檔。
RTF_OUTPUT
與HTML_OUTPUT 用法相同,用來指定RTF 輸出檔案路徑。預設為rtf
GENERATE_MAN
若設定為YES ,則會產生Unix Man Page 格式的説明文件。
MAN_OUTPUT
與HTML_OUTPUT 用法相同,用來指定Man Page的輸出目錄。預設為man。
GENERATE_XML
若設定為YES ,則會產生XML 格式的説明文件。
ENABLE_PREPROCESSING
若設定為YES ,則Doxygen 會啓動C 的前置處理器來處理原始檔。
PREDEFINED
可以讓您自行定義一些宏。類似於gcc 中的-D選項。
若上面這些基本的Tag 都設定正確,接下來就是將您的Source Code
批註修改成為正確的格式。若您覺得用一般文字編輯器來編輯組態檔
很麻煩,建議您可以使用Doxygen Wizard這個工具程序。他可以很快
的建構出您所需要的Doxygen檔案。

Doxygen使用步驟

由於只是工具的使用,這裏不介紹它的原理,直接從使用步驟開始。Doxygen的使用步驟非常簡單。主要可以分為:
1)第一次使用需要安裝doxygen的程序
2)生成doxygen配置文件
3)編碼時,按照某種格式編寫註釋
4)生成對應文檔
doxygen的安裝非常簡單, linux下可以直接下載安裝包運行即可,下載源代碼編譯安裝也是比較通用的編譯安裝命令。請參考其安裝文檔完成安裝。
Doxygen在生成文檔時可以定義項目屬性以及文檔生成過程中的很多選項,使用下面命令能夠產生一個缺省的配置文件:
doxygen -g [配置文件名]
可以根據項目的具體需求修改配置文件中對應的項,具體的修改過程在下面介紹。修改過的配置文件可以作為以後項目的模板。
讓doxygen自動產生文檔,平常的註釋風格可不行,需要遵循doxygen自己的格式。具體如何寫doxygen認識的註釋在第3節詳細介紹。
OK,代碼編完了,註釋也按照格式寫好了,最後的文檔是如何的哪?非常簡單,運行下面的命令,相應的文檔就會產生在指定的目錄中。
doxygen [配置文件名]
需要注意的是doxygen並不處理所有的註釋,doxygen重點關注與程序結構有關的註釋,比如:文件、類、結構、函數、變量、宏等註釋,而忽略函數內變量、代碼等的註釋。

Doxygen配置文件

doxygen配置文件的格式是也是通常的unix下配置文件的格式:註釋'#'開始;tag = value [,value2…];對於多值的情況可以使用 tag += value [,value2…]。
對doxygen的配置文件的修改分為兩類:一種就是輸出選項,控制如何解釋源代碼、如何輸出;一種就是項目相關的信息,比如項目名稱、源代碼目 錄、輸出文檔目錄等。對於第一種設置好後,通常所有項目可以共用一份配置,而後一種是每個項目必須設置的。下面選擇重要的,有可能需要修改的選項進行解釋 説明,其他選項在配置文件都有詳細解釋。
TAG 缺省值 含義
PROJECT_NAME 項目名稱
PROJECT_NUMBER 可以理解為版本信息
OUTPUT_DIRECTORY 輸出文件到的目錄,相對目錄(doxygen運行目錄)或者絕對目錄
INPUT 代碼文件或者代碼所在目錄,使用空格分割
FILE_PATTERNS *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp *.h++ *.idl *.odl 指定INPUT的目錄中特定文件,如:*.cpp *.c *.h
RECURSIVE NO 是否遞歸INPUT中目錄的子目錄
EXCLUDE 在INPUT目錄中需要忽略的子目錄
EXCLUDE_PATTERNS 明確指定的在INPUT目錄中需要忽略的文件,如:FromOut*.cpp
OUTPUT_LANGUAGE English 生成文檔的語言,當前支持2、30種語言,國內用户可以設置為Chinese
USE_WINDOWS_ENCODING YES(win版本)
NO(unix版本) 編碼格式,默認即可。
EXTRACT_ALL NO 為NO,只解釋有doxygen格式註釋的代碼;為YES,解析所有代碼,即使沒有註釋。類的私有成員和所有的靜態項由EXTRACT_PRIVATE和 EXTRACT_STATIC控制
EXTRACT_PRIVATE NO 是否解析類的私有成員
EXTRACT_STATIC NO 是否解析靜態項
EXTRACT_LOCAL_CLASSES YES 是否解析源文件(cpp文件)中定義的類
SOURCE_BROWSER NO 如果為YES,源代碼文件會被包含在文檔中
INLINE_SOURCES NO 如果為YES,函數和類的實現代碼被包含在文檔中
ALPHABETICAL_INDEX NO 生成一個字母序的列表,有很多類、結構等項時建議設為YES
GENERATE_HTML YES 是否生成HTML格式文檔
GENERATE_HTMLHELP NO 是否生成壓縮HTML格式文檔(.chm
GENERATE_LATEX YES 是否生成latex格式的文檔
GENERATE_RTF NO 是否生成RTF格式的文檔
GENERATE_MAN NO 是否生成man格式文檔
GENERATE_XML NO 是否生成XML格式文檔

Doxygen註釋

註釋風格
下面是工作量最大部分,安照doxygen格式寫註釋。通常代碼可以附上一個註釋塊來對 代碼進行解釋,一個註釋塊由一行或者多行組成。通常一個註釋塊包括一個簡要説明(brief)和一個詳細説明(detailed),這兩部分都是可選的。 可以有多種方式標識出doxygen可識別的註釋塊。
1)JavaDoc類型的多行註釋。
2)QT樣式的多行註釋。
3) /// …text….
4) //! …text….
簡要説明有多種方式標識,這裏推薦使用@brief命令強制説明,例如:
以上這些註釋格式用來對緊跟其後的代碼進行註釋。doxygen也允許把註釋放到代碼後面,具體格式是放一個'<'到註釋開始部分。例如:
int var1 ;
int var2; ///< ….text….
註釋和代碼完全分離,放在其他地方也是允許的,但需要使用特殊的命令加上名稱或者聲明進行標識,比如:class、structunion、 enum、fn、var、def、file、namespace、package、interface(這些也就是doxygen關注的註釋類型)。這裏 不推薦使用,建議註釋儘量放在代碼前後。具體使用方式參見doxygen手冊。
doxygen常用註釋格式
通常的選擇上面的一、兩種註釋風格,遇到頭文件中各種類型定義,關鍵變量、宏的定義,在其前或者後使用 @brief 定義其簡要説明,空一行後繼續寫其詳細的註釋即可。
對函數的註釋,是比較常常需要註釋的部分。除了定義其簡要説明以及詳細註釋,還可以使用param命令對其各個參數進行註釋,使用return命令對返回值進行註釋。常見的格式如下:
int func1(int a, int b);
進行設計時,通常有模塊的概念,一個模塊可能有多個類或者函數組成,完成某個特定功能的代碼的集合。如何對這個概念進行註釋?doxygen提供了group的概念,生成的模塊的註釋會單獨放在一個模塊的頁面中。使用下面的格式定義一個group。
code
group中的代碼可以有自己的註釋。單純定義一個模塊,去除{ 和}命令即可。任何其他代碼項(比如類、函數、甚至文件)如果要加入到某個模塊,可以在其doxygen註釋中使用ingroup命令即可。Group之間使用ingroup命令,可以組成樹狀關係。
把多個代碼項一起添加到某個模塊中可以使用addtogroup命令,格式和defgroup相似。
對於某幾個功能類似的代碼項(比如類、函數、變量)等,如果希望一起添加註釋,而又不想提升到模塊的概念,可以通過下面的方式:
//@{
code…
//@}
對這種組進行命名可以使用name命令。此時中間代碼可以有自己的註釋。如:
//@{
code…
//@}
doxygen常用註釋命令
doxygen通過註釋命令識別註釋中需要特殊處理的註釋,比如函數的參數、返回值進行突出顯示。上面也提到了一些註釋命令(如:brief、param、return、以及group相關的命令),下面對其他一些常用的註釋命令進行解釋説明。
@exception <exception-object> {exception description} 對一個異常對象進行註釋。
@warning {warning message } 一些需要注意的事情
@todo { things to be done } 對將要做的事情進行註釋
@see {comment with reference to other items } 一段包含其他部分引用的註釋,中間包含對其他代碼項的名稱,自動產生對其的引用鏈接
@relates <name> 通常用做把非成員函數的註釋文檔包含在類的説明文檔中。
@since {text} 通常用來説明從什麼版本、時間寫此部分代碼。
@deprecated
@pre { description of the precondition } 用來説明代碼項的前提條件。
@post { description of the postcondition } 用來説明代碼項之後的使用條件。
@code 在註釋中開始説明一段代碼,直到@endcode命令。
@endcode 註釋中代碼段的結束。
到此為止,常用的doxygen的註釋格式討論完畢,我們能夠按照一定的格式撰寫doxygen認識的註釋,並能夠使用doxygen方便快捷的生成對應的文檔,不過註釋中應該寫些什麼,如何撰寫有效的註釋可能是困擾開發人員的一個更深層次的問題。
註釋的書寫
註釋應該怎麼寫,寫多還是寫少。過多的註釋甚至會干擾對代碼的閲讀。寫註釋的一個總的原則就是註釋應該儘量用來表明作者的 意圖,至少也應該是對一部分代碼的總結,而不應該是對代碼的重複或者解釋。對代碼的重複或者解釋的代碼,看代碼可能更容易理解。反映作者意圖的註釋解釋代 碼的目的,從解決問題的層次上進行註釋,而代碼總結性註釋則是從問題的解答的層次上進行註釋。
推薦的寫註釋的過程是首先使用註釋勾勒出代碼的主要框架,然後根據註釋撰寫相應的代碼。對各種主要的數據結構、輸出的函數、多個函數公用的變量進行詳細地註釋。對代碼中控制結構,單一目的的語句集進行註釋。下面是一些寫註釋時需要注意的要點:
避免對單獨語句進行註釋;
通過註釋解釋為什麼這麼做、或者要做什麼,使代碼的讀者可以只閲讀註釋理解代碼;
對讀者可能會有疑問的地方進行註釋;
數據定義進行註釋,而不是對其使用過程進行註釋;
對於難於理解的代碼,進行改寫,而不要試圖通過註釋加以説明;
對關鍵的控制結構進行註釋;
對數據和函數的邊界、使用前提等進行註釋;

Doxygen建立文件

當您前面所有的步驟都正確無誤執行後,只需要執行下面的命令就可建立出您要的文件了:
> doxygen Doxygen
如果有錯誤產生,請檢查您的Doxygen 組態檔設定是否有誤,目錄的存取權限是否足夠。如果輸出的結果不正確,請檢查您的批註是否符合格式。批註的位置是否正確。舉例來説,您不可在説明class的批註與class 本身插入其它的程序代碼或宣告。否則Doxygen 就無法將批註與該class對應起來。
如果您使用Doxygen Wizard,可直接使用上面的Run 的按鈕或選單項目來製作説明文件。如果是產生HTML文件,在HTML_OUTPUT 所指定的目錄中的index.html將是您説明文件的首頁。
在中文繁體方面,目前我僅成功製作出HTML與RTF 格式的説明文件。其它格式的過程比較複雜,需要搭配其它工具,有待各位自行嘗試。

Doxygen版本

2012年12月28日,Doxygen 1.8.3 發佈,文檔生成工具
2016年12月29日,Doxygen 1.8.13 發佈,文檔生成工具