青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 16,  comments - 81,  trackbacks - 0
Doxygen+Graphviz 幫助
2010-02-02 10:33
@class 聲明一個類
@fn 聲明一個函數
@brief 簡要說明
/**
@file RenderMgr.h
@brief 渲染管理類
@date 3/16/2006
@author lethean
*/
@param 聲明一個參數
@note 注解
@par paragraph,自定義一個段落標題,類似html中<p>
@code 代碼示例,需要用@endcode封閉,代碼段中不需要加前置*號

/**
@brief 讀取bmp文件
@remarks 測試一下
@param [in] dc 傳入一個dc用于臨時操作
@param [in] filename bmp文件名
@note 屏幕dc只能在一處被使用,請確保傳入屏幕dc后其他地方不會操作該dc
@par 代碼示例:
@code
   //使用
   CDC* dc = AfxGetMainWindow()->GetDC();
   Bitmap bmp( dc , "test.bmp");
   AfxGetMainWindow()->ReleaseDC( dc );
@endcode
*/
對于單行的前置注釋可以用///,或者/** blahblah */ 樣式
///我是一個變量
int index;
對于單行的后置注釋,需要加一個"<"符號
int count; ///< 我也是
/** 協(xié)議標識 */
enum ProtoId { 
PROTOID_LOGIN, /**< 登陸協(xié)議*/
PROTOID_BROWSE, /**< 瀏覽協(xié)議*/
};
@defgroup是用來定義新模塊的
集中在某個頭文件中定義所有的模塊,然后在屬于這個模塊的類定義處使用@ingroup
EnginePrerequisite.h中
/** 
@defgroup Render Render渲染模塊
@defgroup Resource Resource管理模塊
@defgroup Sound Sound聲音模塊
@defgroup Anim Anim動畫模塊
@defgroup Math Math數學庫模塊
@defgroup Script Script腳本模塊
*/
RenderMgr.h中
/**
@class RenderMgr
@ingroup Render
*/

JavaDoc類型:

/**

* ... 程序注釋 ...

*/

Qt類型:

/*!

* ... 程序注釋...

*/    

單行型式:

/// 這是一個簡潔型的注釋

//! 這也是一個簡潔型的注釋

Doxygen的這幾種基本注釋類型就可以建立足以建立文檔了,如果需要更多復雜功能,Doxygen還可以提供高級格式如組(group)和列表。

Doxygen的常用注釋參數:

@file

檔案的批注說明。

@author

作者的信息

@brief

用于class function的批注中,后面為class function的簡易說明。

@param

格式為

@param arg_name 參數說明

主要用于函式說明中,后面接參數的名字,然后再接關于該參數的說明。

@return

后面接函數傳回值的說明。用于function的批注中。說明該函數的傳回值。

@retval

格式為

@retval value 傳回值說明

主要用于函式說明中,說明特定傳回值的意義。所以后面要先接一個傳回值。然后在放該傳回值的說明。

Doxygen的使用,如下:

E:\>xstring目錄包含下列文件:

Xstring.cpp

Xstring.h

其中xstring.h里對xstring類的StrToInt方法的注釋如下:

       /**

       *

0. 序言
為代碼寫注釋一直是大多數程序員有些困擾的事情。當前程序員都能接受為了程序的可維護性、可讀性編碼的同時寫注釋的說法,但對哪些地方應該寫注釋,注釋如何寫,寫多少等這些問題,很多程序員仍然沒有答案。更頭痛的是寫文檔,以及維護文檔的問題,開發(fā)人員通常可以忍受編寫或者改動代碼時編寫或者修改對應的注釋,但之后需要修正相應的文檔卻比較困難。如果能從注釋直接轉化成文檔,對開發(fā)人員無疑是一種福音。而doxygen就能把遵守某種格式的注釋自動轉化為對應的文檔。

Doxygen是基于GPL的開源項目,是一個非常優(yōu)秀的文檔系統(tǒng),當前支持在大多數unix(包括linux),windows家族,Mac系統(tǒng)上運行,完全支持C++, C, Java, IDL(Corba和Microsoft 家族)語言,部分支持PHP和C#語言,輸出格式包括HTML、latex、RTF、ps、PDF、壓縮的HTML和unix manpage。有很多開源項目(包括前兩篇文章介紹的log4cpp和CppUnit)都使用了doxygen文檔系統(tǒng)。而國內的開發(fā)人員卻使用的不多,這里從開發(fā)人員使用的角度介紹這個工具,使開發(fā)人員用最少的代價盡快掌握這種技術,并結合這個工具探討如何撰寫注釋的問題。以下以linux下的C++語言為例進行介紹,以下討論基于doxygen1.3.3。

1. doxygen使用步驟
由于只是工具的使用,這里不介紹它的原理,直接從使用步驟開始。Doxygen的使用步驟非常簡單。主要可以分為:
1)第一次使用需要安裝doxygen的程序
2)生成doxygen配置文件
3)編碼時,按照某種格式編寫注釋
4)生成對應文檔
doxygen的安裝非常簡單, linux下可以直接下載安裝包運行即可,下載源代碼編譯安裝也是比較通用的編譯安裝命令。請參考其安裝文檔完成安裝。

Doxygen在生成文檔時可以定義項目屬性以及文檔生成過程中的很多選項,使用下面命令能夠產生一個缺省的配置文件:
doxygen -g [配置文件名]
可以根據項目的具體需求修改配置文件中對應的項,具體的修改過程在下面介紹。修改過的配置文件可以作為以后項目的模板。

讓doxygen自動產生文檔,平常的注釋風格可不行,需要遵循doxygen自己的格式。具體如何寫doxygen認識的注釋在第3節(jié)詳細介紹。

OK,代碼編完了,注釋也按照格式寫好了,最后的文檔是如何的哪?非常簡單,運行下面的命令,相應的文檔就會產生在指定的目錄中。
   doxygen [配置文件名]

需要注意的是doxygen并不處理所有的注釋,doxygen重點關注與程序結構有關的注釋,比如:文件、類、結構、函數、變量、宏等注釋,而忽略函數內變量、代碼等的注釋。

2. 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,解析所有代碼,即使沒有注釋。類的私有成員和所有的靜態(tài)項由EXTRACT_PRIVATE和 EXTRACT_STATIC控制
EXTRACT_PRIVATE NO 是否解析類的私有成員
EXTRACT_STATIC NO 是否解析靜態(tài)項
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格式文檔
  

3. doxygen注釋
3.1 注釋風格
下面是工作量最大部分,安裝doxygen格式寫注釋。通常代碼可以附上一個注釋塊來對代碼進行解釋,一個注釋塊由一行或者多行組成。通常一個注釋塊包括一個簡要說明(brief)和一個詳細說明(detailed),這兩部分都是可選的。可以有多種方式標識出doxygen可識別的注釋塊。
1)JavaDoc類型的多行注釋。
/**
* ….text….
*/
2)QT樣式的多行注釋。
/*!
….text….
*/
3) /// …text….
4) //! …text….
簡要說明有多種方式標識,這里推薦使用@brief命令強制說明,例如:
/**
* @brief [some brief description ]
*      [ brief description more. ]

* [some more detailed description…]
*/
以上這些注釋格式用來對緊跟其后的代碼進行注釋。doxygen也允許把注釋放到代碼后面,具體格式是放一個'<'到注釋開始部分。例如:
int var1 ; /**< ….text…. */
int var2; ///< ….text….

注釋和代碼完全分離,放在其他地方也是允許的,但需要使用特殊的命令加上名稱或者聲明進行標識,比如:class、struct、union、enum、fn、var、def、file、namespace、package、interface(這些也就是doxygen關注的注釋類型)。這里不推薦使用,建議注釋盡量放在代碼前后。具體使用方式參見doxygen手冊。

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

對函數的注釋,是比較常常需要注釋的部分。除了定義其簡要說明以及詳細注釋,還可以使用param命令對其各個參數進行注釋,使用return命令對返回值進行注釋。常見的格式如下:
/**
*@brief func's brief comment.
*
* Some detailed comment.
*@param a [param a 's comment.]
*@param b [param b 's comment.]
*@exception std::out_of_range [exception's comment.]
*@return [return's comment.]
*/
int func1(int a, int b);

進行設計時,通常有模塊的概念,一個模塊可能有多個類或者函數組成,完成某個特定功能的代碼的集合。如何對這個概念進行注釋?doxygen提供了group的概念,生成的模塊的注釋會單獨放在一個模塊的頁面中。使用下面的格式定義一個group。
/** [group_name] [brief group description ]
* detailed group description ]
* @{
*/
code
/** @} */
group中的代碼可以有自己的注釋。單純定義一個模塊,去除{ 和}命令即可。任何其他代碼項(比如類、函數、甚至文件)如果要加入到某個模塊,可以在其doxygen注釋中使用ingroup命令即可。Group之間使用ingroup命令,可以組成樹狀關系。
/** @file util.cpp 
* @ingroup [group_name]
* @brief file's brief info.
*/
把多個代碼項一起添加到某個模塊中可以使用addtogroup命令,格式和defgroup相似。

對于某幾個功能類似的代碼項(比如類、函數、變量)等,如果希望一起添加注釋,而又不想提升到模塊的概念,可以通過下面的方式:
//@{
/** Comments for all below code. */
code…
//@}
對這種組進行命名可以使用name命令。此時中間代碼可以有自己的注釋。如:
/** @name group_name
* description for group.
*/
//@{
code…
//@}

3.3 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方便快捷的生成對應的文檔,不過注釋中應該寫些什么,如何撰寫有效的注釋可能是困擾開發(fā)人員的一個更深層次的問題。

4. 注釋的書寫
注釋應該怎么寫,寫多還是寫少。過多的注釋甚至會干擾對代碼的閱讀。寫注釋的一個總的原則就是注釋應該盡量用來表明作者的意圖,至少也應該是對一部分代碼的總結,而不應該是對代碼的重復或者解釋。對代碼的重復或者解釋的代碼,看代碼可能更容易理解。反映作者意圖的注釋解釋代碼的目的,從解決問題的層次上進行注釋,而代碼總結性注釋則是從問題的解答的層次上進行注釋。

推薦的寫注釋的過程是首先使用注釋勾勒出代碼的主要框架,然后根據注釋撰寫相應的代碼。對各種主要的數據結構、輸出的函數、多個函數公用的變量進行詳細地注釋。對代碼中控制結構,單一目的的語句集進行注釋。下面是一些寫注釋時需要注意的要點:
   避免對單獨語句進行注釋;
   通過注釋解釋為什么這么做、或者要做什么,使代碼的讀者可以只閱讀注釋理解代碼;
   對讀者可能會有疑問的地方進行注釋;
   對數據定義進行注釋,而不是對其使用過程進行注釋;
   對于難于理解的代碼,進行改寫,而不要試圖通過注釋加以說明;
   對關鍵的控制結構進行注釋;
   對數據和函數的邊界、使用前提等進行注釋;

      雖然使用各種IDE或者Source Insight 可以方便地在windows下閱讀和分析C/C++代碼,但是一步步Go to Definetion 實在令人痛苦。Doxygen能夠生成函數調用關系圖,所有的函數調用關系可以一目了然,另外他還能統(tǒng)計文檔中所有的類,成員變量,成員函數等。總的來說,Doxygen不但能從局部把握代碼,還能從全局審視代碼,后者是一般IDE和Source Insight 不能做到的。所以,使用doxygen閱讀分析代碼可以達到事半功倍的效果。

          doxygen的安裝很簡單,到官方網站下載doxygen的windows安裝程序即可。除了安裝doxygen外,還需要安裝graphviz,因為doxygen需要使用graphviz的dot.exe生成調用圖。graphviz在它的官方網站上也可以下載到安裝程序。不過我下載的安裝程序在安裝時老是報cab文件錯誤。最后我下載了graphviz的release文件,即安裝程序下面的zip壓縮文件,下載完成后解壓縮即可。

         安裝完doxygen后即可進行適當的配置,然后運行doxyfile生成文檔。基本的配置前人早有說明,不再贅述。需要注意的是:

        1.要勾選Dot選項卡下面的HAVE_DOT、CALL_GRAPH 、CALLER_GRAPH 選項。并在DOT_PATH下面填入dot.exe的路徑,也就是graphviz安裝目錄下的bin文件夾。

        2.勾選Wizard->Project選項卡下面的Scan recursively!

        3.勾選Build選項卡下面的EXTRACT_ALL、EXTRACT_PRIVATE、EXTRACT_STATIC、EXTRACT_LOCAL_CLASSES、EXTRACT_LOCAL_METHODS選項

        4.如果程序里面有中文,將Project選項卡下的DOXYFILE_ENCODING和Input選項卡下面的INPUT_ENCODING改為GBK

       5.可以勾掉LATEX輸出,這樣節(jié)省編譯時間

5. 參考資料
1. doxygen homepage
http://www.stack.nl/~dimitri/doxygen/

2. doxygen manual 
http://www.stack.nl/~dimitri/doxygen/manual.html

3. Code Complete: A Practical Handbook of Software Construction. Redmond, Wa.: Microsoft Press, 880 pages, 1993. ISBN: 1-55615-484-4. 

4. 簡介doxygen
http://www.stack.nl/~dimitri/doxygen/doxygen_intro_cn.html

5. 10 Minutes to document your code
http://www.codeproject.com/tips/doxysetup.asp

6. 使用doxygen
http://www.csdn.net/Develop/article/16%5C16383.shtm

posted on 2010-09-08 15:45 叫我老王吧 閱讀(4282) 評論(0)  編輯 收藏 引用 所屬分類: 轉貼

只有注冊用戶登錄后才能發(fā)表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品国产三级国产普通话蜜臀| 亚洲国产欧美一区二区三区同亚洲 | 久久久亚洲精品一区二区三区| 亚洲摸下面视频| 亚洲婷婷免费| 欧美一区二区视频97| 久久免费视频这里只有精品| 蜜臀av性久久久久蜜臀aⅴ| 欧美激情一级片一区二区| 欧美日韩一区二区在线观看| 国产精品久久久久久久久| 国产综合在线看| 亚洲精品欧美专区| 亚洲欧美日韩综合国产aⅴ| 久热精品视频在线观看一区| 亚洲激情视频网| 亚洲一区二区三区午夜| 久久亚洲影音av资源网| 欧美午夜精品一区| 亚洲福利专区| 亚洲欧美激情视频在线观看一区二区三区 | 国产一区二区三区久久悠悠色av| 国内视频一区| 亚洲视频导航| 欧美高清不卡在线| 亚洲欧美另类国产| 亚洲天堂av高清| 国产免费观看久久| 亚洲激情综合| 午夜精品婷婷| 亚洲人成人一区二区在线观看 | 一本色道久久综合亚洲精品不卡| 性色av一区二区三区在线观看 | 欧美啪啪成人vr| 国产日韩欧美成人| 亚洲天天影视| 亚洲大片免费看| 欧美有码在线视频| 国产精品免费观看在线| 99在线精品免费视频九九视| 玖玖在线精品| 久久精品视频在线看| 国产麻豆午夜三级精品| 亚洲小视频在线| 亚洲欧洲日韩综合二区| 欧美1区3d| 亚洲成人影音| 免费成人高清| 久久久久天天天天| 一区二区三区在线高清| 久久精品成人| 亚洲欧美亚洲| 国产精品一区二区三区成人| 亚洲综合另类| 亚洲一区二区3| 国产精品国产三级国产专区53| 99热在线精品观看| 亚洲黄色av一区| 欧美激情视频给我| 99国产精品99久久久久久| 亚洲日本中文字幕免费在线不卡| 欧美国产精品va在线观看| 亚洲三级性片| 亚洲美女黄网| 国产精品毛片| 久久人人爽爽爽人久久久| 久久久噜噜噜久久| 亚洲精品1区2区| 亚洲精品视频免费在线观看| 欧美日韩一区二区三区免费看 | 国产精品久久久久7777婷婷| 亚洲天堂视频在线观看| 宅男噜噜噜66一区二区| 国产喷白浆一区二区三区| 久久久久国产精品一区三寸| 久久久久欧美精品| 夜夜嗨av色综合久久久综合网| 一区二区三区日韩在线观看| 国产日本精品| 亚洲高清视频在线观看| 国产精品99一区| 亚洲天堂免费观看| 亚洲视频精选| 欧美亚洲尤物久久| 亚洲高清不卡一区| 日韩视频专区| 国产小视频国产精品| 欧美护士18xxxxhd| 欧美视频一区二区| 久久午夜精品一区二区| 欧美精品乱人伦久久久久久| 欧美亚洲视频| 欧美大片一区二区| 久久都是精品| 欧美日本一区| 蜜桃视频一区| 国产精品欧美久久| 欧美福利电影网| 国产午夜精品一区二区三区视频 | 欧美一级成年大片在线观看| 久久综合久久综合这里只有精品 | 亚洲欧美国产精品桃花| 亚洲国产成人porn| 中文在线资源观看网站视频免费不卡| 精品51国产黑色丝袜高跟鞋| 宅男精品视频| 亚洲精品一区在线| 欧美一区激情| 亚洲女人小视频在线观看| 久久综合亚洲社区| 久久av二区| 国产精品国产三级国产aⅴ浪潮| 欧美福利一区| 极品日韩av| 欧美一区二区视频免费观看| 亚洲视频你懂的| 欧美激情第三页| 欧美激情国产日韩| 在线观看欧美亚洲| 久久成年人视频| 久久国产精彩视频| 国产精品成人v| 中文国产成人精品| 亚洲一区二区三区在线观看视频| 欧美大片一区二区| 亚洲国产精品成人| 亚洲精品免费电影| 欧美α欧美αv大片| 亚洲电影天堂av| 亚洲人成亚洲人成在线观看| 乱人伦精品视频在线观看| 欧美成人综合| 亚洲精品久久久一区二区三区| 老色鬼久久亚洲一区二区| 久久只有精品| 在线视频观看日韩| 欧美成人国产| 亚洲日本中文字幕免费在线不卡| 日韩视频在线观看免费| 欧美日本不卡视频| 99国产精品久久久久久久| 亚洲午夜电影网| 国产老肥熟一区二区三区| 欧美 日韩 国产精品免费观看| 亚洲午夜激情免费视频| 欧美黄色一区二区| 91久久久亚洲精品| 一区二区三区精品在线| 欧美日韩免费看| 在线视频精品一| 久久国产毛片| 亚洲国产你懂的| 欧美日韩xxxxx| 亚洲一区二区影院| 久久久久久久久岛国免费| 怡红院精品视频| 欧美黄色精品| 亚洲一区区二区| 美国成人毛片| 亚洲婷婷免费| 黑人一区二区三区四区五区| 欧美激情乱人伦| 午夜激情综合网| 91久久精品国产91久久| 欧美亚洲免费电影| 亚洲黄网站在线观看| 国产精品高潮呻吟视频| 久久久激情视频| 日韩视频精品| 久久夜色精品国产| 一本色道久久综合亚洲精品小说| 国产精品网站视频| 麻豆91精品91久久久的内涵| 一区二区三区四区在线| 欧美成人国产va精品日本一级| 一本色道久久综合| 揄拍成人国产精品视频| 国产精品国产三级国产普通话99| 久热国产精品视频| 午夜精品久久久久久久白皮肤 | 中文在线不卡| 亚洲电影自拍| 久久免费观看视频| 亚洲综合成人在线| 亚洲精品欧美日韩| 在线播放视频一区| 国产欧美日韩综合精品二区| 欧美日韩国产色综合一二三四| 久久久久久久一区二区三区| 亚洲一区影院| 宅男噜噜噜66一区二区| 亚洲国产精品一区制服丝袜 | 国产精品久久久久久久久借妻| 蜜臀av一级做a爰片久久| 欧美一区二区三区久久精品茉莉花 | 欧美午夜精品理论片a级大开眼界| 久久全球大尺度高清视频| 亚洲一区在线直播| 99视频一区| 一区二区福利|