本章涵蓋兩個主題
特殊註解區塊是 C 或 C++ 樣式的註解區塊,帶有一些額外的標記,因此 Doxygen 知道它是需要放在產生文件中的結構化文字。 下一節介紹 Doxygen 支援的各種樣式。
對於 Python、VHDL 和 Fortran 程式碼,有不同的註解慣例,可以在Python 中的註解區塊、VHDL 中的註解區塊和Fortran 中的註解區塊章節中找到。
對於程式碼中的每個實體,都有兩種(或在某些情況下是三種)描述,它們共同構成了該實體的文件;簡要描述和詳細描述,兩者都是可選的。對於方法和函數,還有第三種描述,即所謂的內文描述,它由方法或函數主體內找到的所有註解區塊的串聯組成。
允許有多個簡要或詳細描述(但不建議,因為描述出現的順序未指定)。
顧名思義,簡要描述是一個簡短的一行文字,而詳細描述則提供更長、更詳細的文件。"內文"描述也可以充當詳細描述,或描述一系列實作細節。對於 HTML 輸出,簡要描述也用於在參考項目的地方提供工具提示。
有多種方法可以將註解區塊標記為詳細描述
您可以使用 Javadoc 樣式,它由以兩個 * 開頭的 C 樣式註解區塊組成,如下所示
/** * ... text ... */
或者您可以使用 Qt 樣式,並在 C 樣式註解區塊的開頭添加驚嘆號 (!),如此範例所示
/*! * ... text ... */
在這兩種情況下,中間的 * 都是可選的,因此
/*! ... text ... */
也是有效的。
第三種選擇是使用至少兩行 C++ 註解行,其中每行都以額外的斜線或驚嘆號開頭。 以下是這兩種情況的範例
/// /// ... text ... ///
或
//! //!... text ... //!
請注意,在這種情況下,空行會結束文件區塊。
有些人喜歡讓他們的註解區塊在文件中更顯眼。為此,您可以使用以下方法
/*******************************************//** * ... text ***********************************************/
注意:2 個斜線結束正常的註解區塊並開始特殊的註解區塊。
注意:使用像 clang-format 這樣的重格式化程式時要小心,因為它可能會將此類註解視為 2 個單獨的註解,並在它們之間引入間距。
或
///////////////////////////////////////////////// /// ... text ... /////////////////////////////////////////////////
或
/*********************************************** * ... text ***********************************************/
只要將JAVADOC_BANNER設定為YES
即可。
按一下這裡以查看 Doxygen 產生的對應 HTML 文件。
對於簡要描述,也有幾種可能性
可以使用帶有上述註解區塊之一的\brief指令。此指令在段落結尾結束,因此詳細描述會在空行之後繼續。
這是一個範例
/*! \brief Brief description. * Brief description continued. * * Detailed description starts here. */
如果在組態檔中將JAVADOC_AUTOBRIEF設定為YES
,則使用 Javadoc 樣式註解區塊會自動開始簡要描述,該描述會在第一個句點、問號或驚嘆號之後接著一個空格或換行符號時結束。這是一個範例
/** Brief description which ends at this dot. Details follow * here. */
此選項對於多行特殊 C++ 註解具有相同的效果
/// Brief description which ends at this dot. Details follow /// here.
第三種選擇是使用不跨越一行以上的特殊 C++ 樣式註解。以下是兩個範例
/// Brief description. /** Detailed description. */
或
//! Brief description. //! Detailed description //! starts here.
請注意最後一個範例中的空行,這是將簡要描述與包含詳細描述的區塊分開所必需的。對於這種情況,JAVADOC_AUTOBRIEF也應設定為NO
。
如您所見,Doxygen 非常靈活。如果您有多個詳細描述,例如在以下範例中
//! Brief description, which is //! really a detailed description since it spans multiple lines. /*! Another detailed description! */
它們會被合併。請注意,即使描述位於程式碼中的不同位置,也會發生這種情況!在這種情況下,順序將取決於 Doxygen 解析程式碼的順序。
與大多數其他文件系統不同,Doxygen 也允許您將成員(包括全域函式)的文件放在定義之前。這樣,文件可以放在原始檔中,而不是標頭檔中。這可以保持標頭檔精簡,並允許成員的實作者更直接地存取文件。作為折衷方案,簡要描述可以放在宣告之前,而詳細描述可以放在成員定義之前。
如果您想要記錄檔案、結構、聯集、類別或列舉的成員,有時會希望將文件區塊放在成員之後,而不是之前。為此,您必須在註解區塊中加入一個額外的 < 標記。請注意,這也適用於函式的參數。
以下是一些範例
int var; /*!< Detailed description after the member */
此區塊可用於在成員之後放置 Qt 樣式的詳細文件區塊。執行相同操作的其他方法是
int var; /**< Detailed description after the member */
或
int var; //!< Detailed description after the member //!<
或
int var; ///< Detailed description after the member ///<
通常,只希望在成員之後放置簡要描述。方法如下
int var; //!< Brief description after the member
或
int var; ///< Brief description after the member
對於函式,可以使用@param指令來記錄參數,然後使用[in]
、[out]
、[in,out]
來記錄方向。對於內嵌文件,也可以透過以方向屬性開頭來實現,例如
void foo(int v /**< [in] docs for input parameter v. */);
請注意,這些區塊的結構和含義與前一節中的特殊註解區塊相同,只有 < 表示成員位於區塊的前面,而不是區塊的後面。
以下是使用這些註解區塊的範例
按一下這裡以查看 Doxygen 產生的對應 HTML 文件。
\class
)不允許在這些註解區塊內使用。YES
時,也會替換註解,並且此註解會用作最後遇到的項目的文件,而不是巨集定義本身的文件!以下是一個使用 Qt 風格的 C++ 程式碼文件範例
點擊這裡查看 Doxygen 生成的對應 HTML 文件。
簡要描述會包含在類別、命名空間或檔案的成員概述中,並使用小的斜體字體列印(此描述可以透過在設定檔中將 BRIEF_MEMBER_DESC 設定為 NO
來隱藏)。預設情況下,簡要描述會成為詳細描述的第一句話(但可以透過將 REPEAT_BRIEF 標籤設定為 NO
來變更)。對於 Qt 風格來說,簡要描述和詳細描述都是可選的。
預設情況下,Javadoc 風格的文檔區塊行為與 Qt 風格的文檔區塊相同。然而,這並不符合 Javadoc 規範,在 Javadoc 規範中,文檔區塊的第一句話會自動被視為簡要描述。要啟用此行為,您應該在設定檔中將 JAVADOC_AUTOBRIEF 設定為 YES。如果您啟用此選項,並且想要在句子中間放置一個句點而不結束句子,您應該在其後放置一個反斜線和一個空格。以下是一個範例
/** Brief description (e.g.\ using only a few words). Details follow. */
以下是與上面相同的程式碼片段,這次使用 Javadoc 風格撰寫文檔,並且將 JAVADOC_AUTOBRIEF 設定為 YES
點擊這裡查看 Doxygen 生成的對應 HTML 文件。
同樣地,如果想要將 Qt 風格文檔區塊的第一句話自動視為簡要描述,可以在設定檔中將 QT_AUTOBRIEF 設定為 YES。
在前一節的範例中,註解區塊始終位於檔案、類別或命名空間的宣告或定義之前,或位於其成員的之前或之後。雖然這通常很方便,但有時可能會有一些原因需要將文檔放置在其他地方。對於編寫檔案的文檔,這是必需的,因為沒有「在檔案之前」這種東西。
Doxygen 允許您將文檔區塊放置在任何地方(例外情況是在函式主體內部或在普通的 C 風格註解區塊內部)。
如果沒有將文檔區塊直接放置在項目之前(或之後),則需要付出代價,即需要在文檔區塊內放置一個結構命令,這會導致一些資訊重複。因此,在實務中,您應該避免使用結構命令,除非其他需求迫使您這樣做。
結構命令(如所有其他命令)以反斜線(\
)或 at 符號(@
)(如果您偏好 Javadoc 風格)開頭,後面接著命令名稱和一個或多個參數。例如,如果您想要為上面範例中的類別 Test
編寫文檔,您也可以將以下文檔區塊放置在 Doxygen 讀取的輸入中的某個位置
/*! \class Test \brief A test class. A more detailed class description. */
這裡使用特殊命令 \class
來指示註解區塊包含類別 Test
的文檔。其他結構命令包括
\struct
:用於為 C 結構編寫文檔。\union
:用於為聯合編寫文檔。\enum
:用於為列舉型別編寫文檔。\fn
:用於為函式編寫文檔。\var
:用於為變數或 typedef 或列舉值編寫文檔。\def
:用於為 #define 編寫文檔。\typedef
:用於為型別定義編寫文檔。\file
:用於為檔案編寫文檔。\namespace
:用於為命名空間編寫文檔。\package
:用於為 Java 套件編寫文檔。\interface
:用於為 IDL 介面編寫文檔。有關這些命令和許多其他命令的詳細資訊,請參閱特殊命令一節。
要為 C++ 類別的成員編寫文檔,您還必須為類別本身編寫文檔。命名空間也適用相同的情況。要為全域 C 函式、typedef、列舉或預處理器定義編寫文檔,您必須先為包含它的檔案編寫文檔(通常這會是一個標頭檔,因為該檔案包含匯出到其他原始碼檔案的資訊)。
/*! \file */或
/** @file */行。
以下是一個名為 structcmd.h
的 C 標頭的範例,該標頭使用結構命令進行文檔編寫
點擊這裡查看 Doxygen 生成的對應 HTML 文件。
由於上面範例中的每個註解區塊都包含一個結構命令,因此所有註解區塊都可以移動到另一個位置或輸入檔案(例如原始碼檔案),而不會影響產生的文檔。這種方法的缺點是原型會重複,因此所有變更都必須進行兩次!因此,您應該先考慮是否真的需要這樣做,並盡可能避免使用結構命令。我經常收到在函式前面的註解區塊中包含 \fn 命令的範例。這顯然是 \fn 命令是多餘的,只會導致問題的情況。
當您在具有以下副檔名之一的檔案中放置註解區塊時:.dox
、.txt
、.doc
、.md
或 .markdown
,或者當副檔名透過 EXTENSION_MAPPING 對應到 md
時,Doxygen 會從檔案清單中隱藏此檔案。
如果您有一個 Doxygen 無法解析但仍想記錄的文件,您可以使用 \verbinclude 來原樣顯示它,例如:
/*! \file myscript.sh * Look at this nice script: * \verbinclude myscript.sh */
請確保該腳本已明確列在 INPUT 中,或者 FILE_PATTERNS 包含 .sh
擴展名,並且該腳本可以在通過 EXAMPLE_PATH 設定的路徑中找到。
對於 Python,有一種使用所謂的文檔字串 ("""
) 來記錄程式碼的標準方法。這些字串儲存在 __doc__
中,並且可以在運行時檢索。Doxygen 會提取這些註解,並假設它們必須以預先格式化的方式呈現。
點擊這裡查看由 Doxygen 產生的相應 HTML 文件。
"""
時,Doxygen 的任何特殊指令都不受支援,並且文字會以逐字文字顯示,請參閱\verbatim。若要使用 Doxygen 的特殊指令並將文字作為一般文件而不是 """
,請使用 """!
或在設定檔中將 PYTHON_DOCSTRING 設定為 NO
。"""
之外,也可以使用 '''
。還有一種使用以 "##" 或 "##<" 開頭的註解來記錄 Python 程式碼的方式。這種註解區塊類型更符合 Doxygen 支援的其他語言的文件區塊工作方式,並且也允許使用特殊指令。
以下是相同的範例,但現在使用 Doxygen 樣式的註解:
點擊這裡查看由 Doxygen 產生的相應 HTML 文件。
由於 Python 看起來更像 Java 而不是 C 或 C++,您應該在設定檔中將 OPTIMIZE_OUTPUT_JAVA 設定為 YES
。
對於 VHDL,註解通常以 "--" 開頭。Doxygen 會提取以 "--!" 開頭的註解。VHDL 中只有兩種註解區塊類型:單行 "--!" 註解,表示簡短的描述,以及多行 "--!" 註解(其中每行重複 "--!" 前綴),表示詳細的描述。
註解始終位於被記錄的項目之前,但有一個例外:對於端口,註解也可以位於項目之後,然後被視為端口的簡短描述。
以下是一個包含 Doxygen 註解的 VHDL 檔案範例:
點擊這裡查看由 Doxygen 產生的相應 HTML 文件。
從 VHDL 2008 開始,也可以使用 /
*
樣式的註解。
Doxygen 會將 /
* ... *
/
作為普通註解處理,並將 /
*! ... *
/
樣式的註解作為 Doxygen 解析的特殊註解處理。
為了獲得正確的外觀輸出,您需要在設定檔中將 OPTIMIZE_OUTPUT_VHDL 設定為 YES
。這也會影響許多其他設定。如果它們沒有被正確設定,Doxygen 會產生警告,說明哪些設定被覆蓋。
當使用 Doxygen 處理 Fortran 程式碼時,您應該將 OPTIMIZE_FOR_FORTRAN 設定為 YES
。
解析器會嘗試猜測原始碼是固定格式的 Fortran 還是自由格式的 Fortran 程式碼。這可能並不總是正確的。如果不是,則應使用 EXTENSION_MAPPING 來更正。通過設定 EXTENSION_MAPPING = f=FortranFixed f90=FortranFree
,副檔名為 f
的檔案會被解釋為固定格式的 Fortran 程式碼,而副檔名為 f90
的檔案則被解釋為自由格式的 Fortran 程式碼。
對於 Fortran,"!>" 或 "!<" 會開始註解,而 "!!" 或 "!>" 可用於將單行註解延續為多行註解。
以下是一個帶有註解的 Fortran 子程式範例:
作為替代方案,您也可以在固定格式的程式碼中使用註解:
前一節重點介紹如何讓 Doxygen 知道您程式碼中的註解,它解釋了簡短描述和詳細描述之間的差異,以及結構指令的使用。
在本節中,我們將探討註解區塊本身的內容。
Doxygen 支援各種格式化註解的樣式。
最簡單的形式是使用純文字。這將在輸出中原樣顯示,並且非常適合簡短的描述。
對於較長的描述,您通常會發現需要一些更結構化的內容,例如逐字文字區塊、列表或簡單表格。為此,Doxygen 支援 Markdown 語法,包括 Markdown Extra 擴展的部分內容。
Markdown 的設計目的是非常容易閱讀和寫作。其格式的靈感來自純文字郵件。Markdown 非常適合簡單、通用的格式設定,例如您專案的簡介頁面。Doxygen 也支援直接讀取 markdown 檔案。如需更多詳細資訊,請參閱 Markdown 支援 章節。
對於程式語言特定的格式設定,Doxygen 在 Markdown 格式設定之上還有兩種額外的標記形式。