關於Doxygen

緣起

在搜索dotGraphviz時,看到doxygen,瞭解doxygen利用dot來繪製方法的關係圖。後來,在fish(friend interactive shell)的幫助文檔時,看到文檔是由doxygen生成的。很好奇,doxygen居然可以生成html文檔,就做了一下資料收集,整理出這麼個文檔出來。

正文

1. Doxygen簡介

Doxygen是一種開源跨平臺的,以類似JavaDoc風格描述的文檔系統,完全支持CC++JavaObjective-CIDL語言,部分支持PHPC#。註釋的語法與Qt-DocKDocJavaDoc兼容。其可以提供三個方面的幫助:

1.它可以從一組帶有文檔(即註釋)的源文件中生成在線文檔(HTML格式),或者離線參考手冊(LATEX格式)。同時還支持生成RTFMS-Word)、PostscriptPDF、壓縮的HTMLUNIX man手冊。文檔是從源文件註釋中直接提取的,從而十分容易保持文檔和源碼的一致。

2.doxygen可配置,用以從沒有標註文檔的源文件中提取代碼結構。這對於要在大量源文件中快速地找到所需的東西來說是非常有用的。通過包含依賴圖(include dependency graphs)、繼承圖(inheritance diagram)和協作圖(collaboration diagram)等手段(它們都是自動生成的),可以使不同成分之間的關係可視化。

3.還可以濫用”doxygen,創建普通文檔。

一個好的程序員在寫程序時,都會在適當的地方加上合適的批註。如果以符合某種格式的方式撰寫批註,就能使用工具程序依據程序結構及批註產生出漂亮的文檔。

2. 支持語言和格式

支持的語言:C/C++,Java,Objective-C,Python,IDL (Corba, MicrosoftKDE-DCOP類型),Fortran,VHDL(一種硬件描述語言),PHP,C#

備註:Ruby的問檔工具爲Rdoc

輸出格式: HTMLXMLLaTeX(間接支持PDF),RTF (MS-Word)PostScriptUnix Man Page

3. 安裝

Ubuntu/debian:sudo apt-get install doxygen

官方下載二進制包(LinuxwindowsMac os各種平臺在官方網站都有的下)或源碼編譯(./configure-->make-->make install)。源碼編譯可能比較麻煩,存在一些前置條件:graphvizflexpythonmake以及g++之類的工具。不過我編譯的時候,沒有出現問題,那些前置條件恰好都滿足,遇到不滿足的,apt-get install就行了。

4. 簡單使用

Doxygen使用可以分爲兩個部分:1.特定格式的註釋的撰寫(主要工作) 2.利用Doxygen工具來生成文檔

下面首先介紹Doxygen支持的註釋格式,然後介紹如何使用doxygen來生成文檔。

4.1. 編寫註釋

一般而言,要爲每個類、以及該類的重要成員函數增加短註釋和長註釋。短註釋應給出類或函數的基本信息的簡要描述。而較長的註釋給出更長和更完整的描述。類的短註釋和長註釋,以及成員函數的簡短描述,將放在頭文件中。成員函數的長註釋將出現在成員函數的實現出現的地方。

4.1.1. 註釋風格

使用doxygen的第一步是在代碼中插入doxygen風格的註釋。代碼附加的註釋塊通常由一行或多行組成,其中包含一個概要說明和詳細說明,可以使用多種不同風格的doxygen註釋:

1)JavaDoc類型的多行註釋

/**

  * ... text ...

  */

2)Qt風格的多行註釋:

/*!

...text...

*/

3)單行註釋:

//! ... one line of text ...

/// ... one line of text ...

http://www.slac.stanford.edu/exp/glast/ground/software/doxygen_examples/v1/class_CsICluster.html提供一個可參照的樣例HTML文檔。

4.1.2. 常用註釋格式

通常的選擇上面的一、兩種註釋風格,遇到頭文件中各種類型定義,關鍵變量、宏的定義,在其前或者後使用@brief定義其簡要說明,空一行後繼續寫其詳細的註釋即可。

函數是需要註釋說明的部分。除了定義其簡要說明以及詳細註釋,還可以使用param命令對其各個參數進行註釋,使用return命令對返回值進行註釋。函數的參數格式如下:

格式1:

/**
<A short one line description>
 
<Longer description>
<May span multiple lines or paragraphs as needed>
 
@param  Description of method's or function's input parameter
@param  ...
@return Description of the return value
*/

格式2:

/**
 * <A short one line description>
 *
 * <Longer description>
 * <May span multiple lines or paragraphs as needed>
 *
 * @param  Description of method's or function's input parameter
 * @param  ...
 * @return Description of the return value
 */

格式3:

/// <A short one line description>
///
/// <Longer description>
/// <May span multiple lines or paragraphs as needed>
///
/// @param  Description of method's or function's input parameter
/// @param  ...
/// @return Description of the return value

C++中常使用的格式:

/**
 * @file
 * @author  John Doe <[email protected]>
 * @version 1.0
 *
 * @section LICENSE
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details at
 * http://www.gnu.org/copyleft/gpl.html
 *
 * @section DESCRIPTION
 *
 * The time class represents a moment of time.
 */
class Time {
 
    public:
       /**
        * Constructor that sets the time to a given value.
        *
        * @param timemillis Number of milliseconds
        *        passed since Jan 1, 1970.
        */
       Time (int timemillis) {
           // the code
       }
       /**
        * Get the current time.
        *
        * @return A time object set to the current time.
        */
       static Time now () {
           // the code
       }
};

進行設計時,通常有模塊的概念,一個模塊可能有多個類或者函數組成,完成某個特定功能的代碼的集合。爲了這個概念進行註釋,doxygen提供了group命令,生成的模塊的註釋會單獨放在一個模塊的頁面中。使用下面的格式定義一個group

group中的代碼可以有自己的註釋。單純定義一個模塊,去除}命令即可。任何其他代碼項(比如類、函數、甚至文件)如果要加入到某個模塊,可以在其doxygen註釋中使用ingroup命令即可。Group之間使用ingroup命令,可以組成樹狀關係。

將多個代碼項一起添加到某個模塊中可以使用addtogroup命令,格式和defgroup相似。對於某幾個功能類似的代碼項(比如類、函數、變量),如果希望一起添加註釋,而又不想提升到模塊的概念,可以通過下面的方式:

//@{

code...

//@}

4.1.3. 常用註釋命令

doxygen通過註釋命令識別註釋中需要特殊處理的註釋,比如函數的參數、返回值進行突出顯示。上面也提到了一些註釋命令(:briefparamreturn、以及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中有一些特殊命令用來增強所生成的文檔。

\author 說明作者

\mainpage 指定用以填充主頁面的註釋的內容。

\section 指定章節信息。

\image 在你的文檔中插入圖像,可以用在任何註釋中。其語法如下所示:

\image html mypicture.gif

注意:doxygen通過IMAGE_PATH的變量在指定的目錄中查找圖像文件,且並非所有格式都支持所有的圖像類型。

到此爲止,常用的doxygen的註釋格式討論完畢,可以按照一定的格式撰寫doxygen識別的註釋,不過註釋中應該寫些什麼,如何撰寫有效的註釋

4.1.4. 註釋的書寫

註釋應該怎麼寫,寫多還是寫少。過多的註釋甚至會干擾對代碼的閱讀,過少又不足以解釋清楚。寫註釋的一個總的原則就是註釋應該儘量用來表明作者的意圖,從解決問題的層次上進行註釋,是重複性介紹一些顯然易見的東西。

寫註釋的過程是首先使用註釋勾勒出代碼的主要框架,然後根據註釋撰寫相應的代碼。對各種主要的數據結構、輸出的函數、多個函數公用的變量進行詳細地註釋。對代碼中控制結構,單一目的的語句集進行註釋。下面是一些寫註釋時需要注意的要點:

  • l 避免對單獨語句進行註釋;
  • l 通過註釋解釋爲什麼這麼做、或者要做什麼,使代碼的讀者可以只閱讀註釋理解代碼;
  • l 對讀者可能會有疑問的地方進行註釋;
  • l 對數據定義進行註釋,而不是對其使用過程進行註釋;
  • l 對於難於理解的代碼,進行改寫,而不要試圖通過註釋加以說明;
  • l 對關鍵的控制結構進行註釋;
  • l 對數據和函數的邊界、使用前提等進行註釋;

4.2. 生成文檔

Doxygen的生成文檔的步驟非常簡單:

1)使用doxygen生成一個配置文件的模板:

doxygen [-s] -g [configName]

如果configName'-'那麼doxygen將會把結果寫到標準輸出。

2)使用doxygen更新舊的配置文件:

doxygen [-s] -u [configName]

3)根據已經存在的配置文件,使用doxygen生成文檔:

doxygen [configName]

如果configName'-'那麼doxygen將會從標準輸入讀取配置信息。

4)使用doxygen生成RTF,HTML,或者Latex風格的模板文件:

RTF格式:doxygen -w rtf styleSheetFile

HTML格式:doxygen -w html headerFile footerFile styleSheetFile [configFile]

LaTex格式:doxygen -w latex headerFile styleSheetFile [configFile]

5)使用doxygen生成rtf擴展文件??

RTF格式:doxygen -e rtf extensionsFile

如果指定了-s那麼配置文件中的註釋將會被忽略。如果配置名被忽略了,那麼'Doxy-file'將被做爲默認的文件使用。

安裝doxygen-doc會獲得如何使用doxygen的更多信息($sudo apt-get install doxygen-doc)。可以查看/usr/share/doc/doxygen

使用Doxyfile時需要設置一些參數。這裏三個有趣的參數,其他的請參考doxygen的配置文件

● INPUT:此參數指定doxygen在其中搜索源碼的目錄。

● FILE_PATTERNS:此參數指定doxygen所要解析的文件的類型。

● IMAGE_PATH:此參數指定doxygen在哪裏查找使用/image命令包含的圖像。

設置完參數就可以運行doxygen。假定配置文件爲Doxyfile,執行

doxygen Doxyfile

doxygen將解析你指定的所有文件。缺省地,HTML輸出將被放在叫作html/的目錄中(這也可在Doxyfile中改變)。

4.2.1. Doxygen的配置文件

Doxygen在生成文檔時存在很多可配置的選項,doxygen -g可以生成缺省的配置文件。doxygen配置文件的格式爲unix下配置文件的格式:

l 註釋'#'開始;

l tag = value[,value2...];

l 對於多值的情況可以使用 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 生成文檔的語言,當前支持230種語言,國內用戶可以設置爲Chinese

DOXYFILE_ENCODING 

UTF-8

文件編碼格式

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格式文檔

4.3. 使用實例

下面使用一個簡單的例子來測試Doxygen,程序的結構是

./src/main.cpp

./src/subModule/myClass.h

./src/subModule/myClass.h

./src/main.cpp

./lib/say.h

./lib/say.cpp

可下載測試文件的鏈接爲test.zip

使用命令doxygen -g test 生成名爲testdoxygen配置文件,對其中的配置項作出如下修改:

#給出所有文檔的輸出目錄

OUTPUT_DIRECTORY       = doc

#設置使用的語言

OUTPUT_LANGUAGE = Chinese

#生成chm格式的壓縮html文檔

GENERATE_HTMLHELP      = YES

#生成latex文檔

GENERATE_LATEX         = YES

#指定doxygen分析的輸入文件(目錄)

INPUT                  = src lib

#指定分析的文件的類型(擴展名)

INCLUDE_FILE_PATTERNS  = *.cpp *.h

#遞歸查找INPUT中的文件

RECURSIVE              = YES

#處理完一個函數的文檔之後,對函數調用的函數也列出相關的鏈接。

REFERENCES_RELATION    = YES

截圖顯示:


Html結果展示:


5. 進一步閱讀

Doxygen使用總結:http://blog.chinaunix.net/uid-9525959-id-2001574.html

Doxygen中文手冊(1.63:http://wenku.baidu.com/view/3b33690f33687e21af45a9c0.html

Doxygen官方主頁:http://www.stack.nl/~dimitri/doxygen/

開發主頁(Githubhttps://github.com/doxygen/doxygen

總結

Doxygen還是比較的強大的工具,花了很長時間來學習和了解這個工具。此外,自己下載源代碼編譯還是很有用處的,可以自己編譯文檔之類的,如果編譯成功確實不錯,但是失敗的時候,也挺令人沮喪的。

有時候,覺得自己寫的相關的主題的東西網上很氾濫,何必再增加重複信息。本着記錄探索的過程的方式,我還是寫了關於這個主題的博客,也有介紹自己的動機,並且還自認爲自己寫的不錯(請原諒我的自戀)。

最近,寫博客的方式是先在WPSLinux版)中編寫,然後複製到csdn的博客中。本地doc的文檔的排版要比博客上的排版好,這裏提供一個pdf版下載鏈接:關於Doxygen


參考文獻

1. Doxygen使用:http://blog.csdn.net/yuantao/article/details/402207

2. Doxygen使用總結:http://blog.chinaunix.net/uid-9525959-id-2001574.html

3. Doxygen中文手冊(1.63:http://wenku.baidu.com/view/3b33690f33687e21af45a9c0.html

4. doxygen使用詳解:http://wenku.baidu.com/view/3ad26a4279563c1ec5da71b7.html

發佈了66 篇原創文章 · 獲贊 18 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章