Doxygen 是一種用於 C/C++、Java™、Python 和其他編程語言的文檔系統, 其功能類似於 java.
1. 安裝doxygen
sudo apt-get graphviz
./configure --prefix=/home/user1/bin
2. 使用doxygen生成文檔
3. 編輯配置文件 Doxyfile
- <OUTPUT_DIRECTORY>:必須在這裏提供一個目錄名,例如 /home/user1/documentation,這個目錄是放置生成的文檔文件的位置。如果提供一個不存在的目錄名,doxygen 會以這個名稱創建具有適當用戶權限的目錄。
- <INPUT>:這個標記創建一個以空格分隔的所有目錄的列表,這個列表包含需要生成文檔的 C/C++ 源代碼文件和頭文件。例如,請考慮以下代碼片段:
INPUT = /home/user1/project/kernel /home/user1/project/memory
在這裏,doxygen 會從這兩個目錄讀取 C/C++ 源代碼。如果項目只有一個源代碼根目錄,其中有多個子目錄,那麼只需指定根目錄並把<RECURSIVE> 標記設置爲
Yes。- <EXCLUDE>:
從文檔目錄排除相應的目錄
- <FILE_PATTERNS>:在默認情況下,doxygen 會搜索具有典型 C/C++ 擴展名的文件,比如 .c、.cc、.cpp、.h 和 .hpp。如果 <FILE_PATTERNS> 標記沒有相關聯的值,doxygen 就會這樣做。如果源代碼文件採用不同的命名約定,就應該相應地更新這個標記。例如,如果項目使用 .c86 作爲 C 文件擴展名,就應該在
<FILE_PATTERNS> 標記中添加這個擴展名。
- <RECURSIVE>:如果源代碼層次結構是嵌套的,而且需要爲所有層次上的 C/C++ 文件生成文檔,就把這個標記設置爲 Yes。例如,請考慮源代碼根目錄層次結構 /home/user1/project/kernel,其中有 /home/user1/project/kernel/vmm 和 /home/user1/project/kernel/asm 等子目錄。如果這個標記設置爲
Yes,doxygen 就會遞歸地搜索整個層次結構並提取信息。
- <EXTRACT_ALL>:這個標記告訴 doxygen,即使各個類或函數沒有文檔,也要提取信息。必須把這個標記設置爲Yes。
- <EXTRACT_PRIVATE>:把這個標記設置爲Yes。否則,文檔不包含類的私有數據成員。
- <EXTRACT_STATIC>:把這個標記設置爲Yes。否則,文檔不包含文件的靜態成員(函數和變量)。
4. doxygen 中的特殊標記
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = YES
EXPAND_ONLY_PREDEF = YES
EXPAND_AS_DEFINED = CONTAINER
只展開宏 CONTAINER .
5. 生成圖形和圖表
<CLASS_DIAGRAMS>:在 Doxyfile 中這個標記默認設置爲 Yes。如果這個標記設置爲 No,就不生成繼承層次結構圖。
<HAVE_DOT>:如果這個標記設置爲 Yes,doxygen 就使用 dot 工具生成更強大的圖形,比如幫助理解類成員及其數據結構的協作圖。注意,如果這個標記設置爲 Yes,<CLASS_DIAGRAMS> 標記就無效了。
<CLASS_GRAPH>:如果 <HAVE_DOT> 標記和這個標記同時設置爲 Yes,就使用 dot 生成繼承層次結構圖,而且其外觀比只使用 <CLASS_DIAGRAMS> 時更豐富。
<COLLABORATION_GRAPH>:如果 <HAVE_DOT> 標記和這個標記同時設置爲 Yes,doxygen 會生成協作圖(還有繼承圖),顯示各個類成員(即包含)及其繼承層次結構。
6. 代碼文檔樣式
/**
* text...
*
*/
也可以加一些標記, '@' 和 '/' 等價:
/**
* @brief bababa
*
* detailed info....
*
*/
----------------------------- Example Begin ---------------------------------
///@file socket_c.h head file of class socket_c.
///Define the interface of class socket_c.
//$Id: socket_c.h 287 2004-06-28 06:20:41Z horin $ 這是普通註釋, 不會生成在文檔中
///@brief class of server socket.
class socket_c
{
private:
public:
///@brief handle the connections of clients.
///@param server the server ip address.
///@param serv_port the server #port.
///@return connected socketfd.
# 具體返回值的註釋,格式: ///@retval 返回值 該返回值的註釋.
///@retval connfd on success.
///@retval 0 on EINTR - system call.
///@retval -1 on error.
# 參見...,格式: ///@see 參見的類/文件等.
///@see main_ppc.cpp
int accept_client(const int listenfd);
};
///@brief structure of child process.
struct child_proc_s
{
# 行尾的註釋,格式: ///< 註釋內容.
pid_t child_pid; ///<child process id.
int child_pipefd; ///<parent's stream pipe to/from child.
};
# 全局變量的註釋,也可以採用上面的行尾格式進行註釋.
///gloable variable for signal.
pid_t g_pid = 0;
----------------------------- Example End ---------------------------------
7. 在vim中使用Doxygen插件: DoxygenToolkit
let g:doxygenToolkit_authorName="your name"
let g:doxygenToolkit_briefTag_funcName="yes"