コードのドキュメント化

この章では、2つのトピックを扱います。

  1. Doxygenが生成するドキュメントに含めるために、コードにコメントをどのように記述するか。これは、次のセクションでさらに詳しく説明されています。
  2. セクションコメントブロックの構造で説明されているように、出力が良好に見えるようにコメントブロックの内容を構造化する方法。

特殊なコメントブロック

特殊なコメントブロックは、CまたはC++スタイルのコメントブロックにいくつかの追加マークが付けられたもので、Doxygenがそれが生成されたドキュメントに含める必要がある構造化されたテキストの一部であることを認識できるようにします。次のセクションでは、Doxygenがサポートするさまざまなスタイルについて説明します。

Python、VHDL、およびFortranコードには、異なるコメント規約があり、それぞれセクションPythonのコメントブロックVHDLのコメントブロック、およびFortranのコメントブロックで見つけることができます。

C系言語(C/C++/C#/Objective-C/PHP/Java)のコメントブロック

コード内の各エンティティには、そのエンティティのドキュメントを構成する2種類(場合によっては3種類)の説明があります。それは、簡潔な説明と詳細な説明で、どちらもオプションです。メソッドと関数には、3番目のタイプの説明である、いわゆるインボディ説明もあり、これはメソッドまたは関数の本体内にあるすべてのコメントブロックを連結したものです。

複数の簡潔な説明または詳細な説明を持つことも許可されています(ただし、説明が表示される順序は指定されていないため、推奨されません)。

その名前が示すように、簡潔な説明は短い1行の記述であり、詳細な説明はより長く、より詳細なドキュメントを提供します。「インボディ」説明も詳細な説明として機能したり、実装の詳細の集合を記述したりできます。HTML出力の場合、簡潔な説明は、アイテムが参照される場所でツールチップを提供するためにも使用されます。

コメントブロックを詳細な説明としてマークするには、いくつかの方法があります。

  1. Javadocスタイルを使用できます。これは、次のように2つのアスタリスクで始まるCスタイルのコメントブロックで構成されます。

    /**
     * ... text ...
     */
    

  2. または、Qtスタイルを使用して、Cスタイルのコメントブロックの開始後に感嘆符 (!) を追加することもできます。次の例に示すとおりです。

    /*!
     * ... text ...
     */
    

    どちらの場合も、途中のアスタリスクはオプションなので、

    /*!
     ... text ...
    */
    

    も有効です。

  3. 3つ目の方法は、少なくとも2つのC++コメント行のブロックを使用することです。各行は追加のスラッシュまたは感嘆符で始まります。2つのケースの例を以下に示します。

    ///
    /// ... text ...
    ///
    

    または

    //!
    //!... text ...
    //!
    

    この場合、空行はドキュメントブロックを終了させることに注意してください。

  4. コメントブロックをドキュメント内でより目立つようにしたい人もいます。この目的のために、以下を使用できます。

    /*******************************************//**
     *  ... text
     ***********************************************/
    

    注: 通常のコメントブロックを終了し、特殊なコメントブロックを開始するための2つのスラッシュ。

    注意:clang-formatのようなリフォーマッターを使用する際には注意が必要です。この種類のコメントを2つの別々のコメントとして認識し、それらの間に空白を挿入する可能性があるためです。

    または

    /////////////////////////////////////////////////
    /// ... text ...
    /////////////////////////////////////////////////
    

    または

    /***********************************************
     *  ... text
     ***********************************************/
    

    JAVADOC_BANNERYES に設定されている限り。

    /**
    * Javadocスタイル(Cスタイル)コメントの簡単な歴史。
    *
    * これは典型的なJavaDocスタイルのCスタイルコメントです。2つの
    * アスタリスクで始まります。
    *
    * @param theory たとえ可能な統一理論が1つしかなくても、それは単なる
    * 一連の規則と方程式です。
    */
    void cstyle( int theory );
    /******************************************************************************
    * Javadocスタイル (Cスタイル) バナーコメントの簡単な歴史。
    *
    * これは典型的なJavadocスタイルCスタイルの「バナー」コメントです。これは
    * スラッシュの後にいくつかのアスタリスク(n > 2)が続きます。これは
    * ソースコードを読んでいる開発者にとってより「視覚的」になるように
    * 書かれています。
    *
    * 多くの場合、開発者はこれが (デフォルトでは) 有効なDoxygen
    * コメントブロックではないことに気づいていません!
    *
    * しかし、Doxyfileに JAVADOC_BANNER = YES が追加されている限り、
    * 期待どおりに動作します。
    *
    * このコメントスタイルはclang-formatと相性が良いです。
    *
    * @param theory たとえ可能な統一理論が1つしかなくても、それは単なる
    * 一連の規則と方程式です。
    ******************************************************************************/
    void javadocBanner( int theory );
    /**************************************************************************//**
    * Doxygenスタイルバナーコメントの簡単な歴史。
    *
    * これはDoxygenスタイルのCスタイル「バナー」コメントです。「通常の」
    * コメントで始まり、その後、最初の行の終わり近くで「特殊な」コメントブロックに変換されます。
    * ソースコードを読んでいる開発者にとってより「視覚的」になるように
    * 書かれています。
    * このコメントスタイルはclang-formatとの相性が悪いです。
    *
    * @param theory たとえ可能な統一理論が1つしかなくても、それは単なる
    * 一連の規則と方程式です。
    ******************************************************************************/
    void doxygenBanner( int theory );

    Doxygenが生成する対応するHTMLドキュメントはこちらをクリックしてください。

簡潔な説明には、いくつかの可能性があります。

  1. 上記のコメントブロックのいずれかと一緒に\briefコマンドを使用できます。このコマンドは段落の終わりで終了するため、詳細な説明は空行の後に続きます。

    例を次に示します

    /*! \brief Brief description.
     *         Brief description continued.
     *
     *  Detailed description starts here.
     */
    

  2. 設定ファイルでJAVADOC_AUTOBRIEFYESに設定されている場合、Javadocスタイルのコメントブロックを使用すると、最初のドット、疑問符、または感嘆符の後にスペースまたは改行が続くまで続く簡潔な説明が自動的に開始されます。例を次に示します。

    /** Brief description which ends at this dot. Details follow
     *  here.
     */
    

    このオプションは、複数行の特別なC++コメントに対しても同じ効果を持ちます。

    /// Brief description which ends at this dot. Details follow
    /// here.
    

  3. 3番目のオプションは、1行を超えない特殊なC++スタイルコメントを使用することです。2つの例を次に示します。

    /// Brief description.
    /** Detailed description. */
    

    または

    //! Brief description.
    
    //! Detailed description
    //! starts here.
    

    最後の例の空白行に注意してください。これは、簡潔な説明と詳細な説明を含むブロックを区切るために必要です。この場合、JAVADOC_AUTOBRIEFNOに設定する必要があります。

ご覧のとおり、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. */);

これらのブロックは、前のセクションの特殊なコメントブロックと同じ構造と意味を持ちますが、< は、メンバーがブロックの後ではなく、ブロックの前に配置されていることを示します。

これらのコメントブロックの使用例を以下に示します。

/*! テストクラス */
class Afterdoc_Test
{
public:
/** 列挙型。
* 列挙型の後にドキュメントブロックを置くことはできません!
*/
enum EnumType
{
int EVal1, /**< 列挙値 1 */
int EVal2 /**< 列挙値 2 */
};
void member(); //!< メンバー関数。
protected:
int value; /*!< 整数値 */
};

Doxygenが生成する対応するHTMLドキュメントはこちらをクリックしてください。

警告
これらのブロックは、メンバーパラメーターのドキュメントにのみ使用できます。ファイル、クラス、共用体、構造体、グループ、名前空間、マクロ、および列挙型自体をドキュメント化するには使用できません。さらに、次のセクションで述べられている構造コマンド(\classなど)は、これらのコメントブロック内では許可されていません。
この構文をマクロ定義の一部として使用する場合は注意が必要です。MACRO_EXPANSIONYES に設定されている場合、マクロが適用される場所ではコメントも置換され、そのコメントは最後の遭遇したアイテムのドキュメントとして使用され、マクロ定義自体のためではないからです!

以下に、Qtスタイルを使用したC++コードのドキュメント化された例を示します。

//! テストクラス。
/*!
より詳細なクラスの説明。
*/
class QTstyle_Test
{
public:
//! 列挙型。
/*! より詳細な列挙型の説明。 */
enum TEnum {
TVal1, /*!< 列挙値 TVal1。 */
TVal2, /*!< 列挙値 TVal2。 */
TVal3 /*!< 列挙値 TVal3。 */
}
//! 列挙型ポインタ。
/*! 詳細。 */
*enumPtr,
//! 列挙型変数。
/*! 詳細。 */
enumVar;
//! コンストラクタ。
/*!
コンストラクタのより詳細な説明。
*/
QTstyle_Test();
//! デストラクタ。
/*!
デストラクタのより詳細な説明。
*/
~QTstyle_Test();
//! 2つの引数を取り、整数値を返す通常のメンバー。
/*!
\param a 整数引数。
\param s 定数文字ポインタ。
\return テスト結果
\sa QTstyle_Test(), ~QTstyle_Test(), testMeToo() and publicVar()
*/
int testMe(int a,const char *s);
//! 純粋仮想メンバー。
/*!
\sa testMe()
\param c1 最初の引数。
\param c2 2番目の引数。
*/
virtual void testMeToo(char c1,char c2) = 0;
//! 公開変数。
/*!
詳細。
*/
int publicVar;
//! 関数変数。
/*!
詳細。
*/
int (*handler)(int a,int b);
};

Doxygenが生成する対応するHTMLドキュメントはこちらをクリックしてください。

簡潔な説明は、クラス、名前空間、またはファイルのメンバー概要に含まれ、小さなイタリック体フォントで表示されます(この説明は、設定ファイルでBRIEF_MEMBER_DESCNOに設定することで非表示にできます)。デフォルトでは、簡潔な説明は詳細な説明の最初の文になります(ただし、REPEAT_BRIEFタグをNOに設定することで変更できます)。Qtスタイルでは、簡潔な説明と詳細な説明の両方がオプションです。

デフォルトでは、JavadocスタイルのドキュメントブロックはQtスタイルのドキュメントブロックと同じように動作します。しかし、Javadocの仕様では、ドキュメントブロックの最初の文が自動的に簡潔な説明として扱われます。この動作を有効にするには、設定ファイルでJAVADOC_AUTOBRIEFをYESに設定する必要があります。このオプションを有効にして、文の途中で文を終了せずにドットを置きたい場合は、ドットの後にバックスラッシュとスペースを置く必要があります。例を次に示します。

  /** Brief description (e.g.\ using only a few words). Details follow. */

以下に、上記と同じコードをJavadocスタイルで、JAVADOC_AUTOBRIEFをYESに設定してドキュメント化したものを示します。

/**
* テストクラス。より詳細なクラスの説明。
*/
class Javadoc_Test
{
public:
/**
* 列挙型。
* より詳細な列挙型の説明。
*/
enum TEnum {
TVal1, /**< 列挙値 TVal1。 */
TVal2, /**< 列挙値 TVal2。 */
TVal3 /**< 列挙値 TVal3。 */
}
*enumPtr, /**< 列挙型ポインタ。詳細。 */
enumVar; /**< 列挙型変数。詳細。 */
/**
* コンストラクタ。
* コンストラクタのより詳細な説明。
*/
Javadoc_Test();
/**
* デストラクタ。
* デストラクタのより詳細な説明。
*/
~Javadoc_Test();
/**
* 2つの引数を取り、整数値を返す通常のメンバー。
* @param a 整数引数。
* @param s 定数文字ポインタ。
* @see Javadoc_Test()
* @see ~Javadoc_Test()
* @see testMeToo()
* @see publicVar()
* @return テスト結果
*/
int testMe(int a,const char *s);
/**
* 純粋仮想メンバー。
* @see testMe()
* @param c1 最初の引数。
* @param c2 2番目の引数。
*/
virtual void testMeToo(char c1,char c2) = 0;
/**
* 公開変数。
* 詳細。
*/
int publicVar;
/**
* 関数変数。
* 詳細。
*/
int (*handler)(int a,int b);
};

Doxygenが生成する対応するHTMLドキュメントはこちらをクリックしてください。

同様に、Qtスタイルのドキュメントブロックの最初の文を自動的に簡潔な説明として扱いたい場合は、設定ファイルでQT_AUTOBRIEFをYESに設定することができます。

その他の場所でのドキュメント

前のセクションの例では、コメントブロックは常にファイル、クラス、または名前空間の宣言または定義の、またはそのメンバーのまたはに配置されていました。これはしばしば都合が良いですが、ドキュメントを別の場所に配置する理由がある場合もあります。ファイルをドキュメント化する場合、これは「ファイルの前に」というものがないため必須です。

Doxygenでは、ドキュメントブロックをほとんどどこにでも配置できます(関数の本体内または通常のCスタイルのコメントブロック内は例外です)。

ドキュメントブロックを項目の直前(または直後)に配置しない場合に生じる代償は、ドキュメントブロック内に構造コマンドを配置する必要があることで、情報が重複する可能性があります。したがって、実際には、他の要件によって強制されない限り、構造コマンドの使用は避けるべきです。

構造コマンド(他のすべてのコマンドと同様に)は、バックスラッシュ(\)またはアットマーク(@)(Javadocスタイルを好む場合)で始まり、その後にコマンド名と1つ以上のパラメータが続きます。たとえば、上記の例でクラスTestをドキュメント化したい場合、Doxygenによって読み込まれる入力のどこかに次のドキュメントブロックを配置することもできます。

/*! \class Test
    \brief A test class.

    A more detailed class description.
*/

ここでは、特殊コマンド\classが、コメントブロックがクラスTestのドキュメントであることを示すために使用されます。その他の構造コマンドは次のとおりです。

  • \struct C構造体をドキュメント化する。
  • \union 共用体をドキュメント化する。
  • \enum 列挙型をドキュメント化する。
  • \fn 関数をドキュメント化する。
  • \var 変数、typedef、またはenum値をドキュメント化する。
  • \def #defineをドキュメント化する。
  • \typedef 型定義をドキュメント化する。
  • \file ファイルをドキュメント化する。
  • \namespace 名前空間をドキュメント化する。
  • \package Javaパッケージをドキュメント化する。
  • \interface IDLインターフェースをドキュメント化する。

これらおよびその他の多くのコマンドの詳細については、セクション特殊コマンドを参照してください。

C++クラスのメンバーを文書化するには、クラス自体も文書化する必要があります。名前空間についても同様です。グローバルなC関数、typedef、enum、またはプリプロセッサ定義を文書化するには、それらを含むファイルを最初に文書化する必要があります(通常、このファイルは他のソースファイルにエクスポートされる情報を含むため、ヘッダファイルになります)。

注意
繰り返しますが、これはよく見落とされがちです。グローバルオブジェクト(関数、typedef、enum、マクロなど)を文書化するには、それらが定義されているファイルを文書化する必要があります。言い換えれば、このファイルには少なくとも
/*! \file */ 
または
/** @file */ 
行が存在しなければなりません。

以下に、構造コマンドを使用してドキュメント化されたstructcmd.hというCヘッダーの例を示します。

/*! \file structcmd.h
\brief ドキュメント化されたファイル。
詳細。
*/
/*! \def MAX(a,b)
\brief \a a と \a b の最大値を返すマクロ。
詳細。
*/
/*! \var typedef unsigned int UINT32
\brief の型定義。
詳細。
*/
/*! \var int errno
\brief 最後のエラーコードを格納します。
\warning スレッドセーフではありません!
*/
/*! \fn int open(const char *pathname,int flags)
\brief ファイル記述子を開きます。
\param pathname 記述子の名前。
\param flags 開くフラグ。
*/
/*! \fn int close(int fd)
\brief ファイル記述子 \a fd を閉じます。
\param fd 閉じる記述子。
*/
/*! \fn size_t write(int fd,const char *buf, size_t count)
\brief \a buf からファイル記述子 \a fd に \a count バイトを書き込みます。
\param fd 書き込む記述子。
\param buf 書き込むデータバッファ。
\param count 書き込むバイト数。
*/
/*! \fn int read(int fd,char *buf,size_t count)
\brief ファイル記述子からバイトを読み取ります。
\param fd 読み取る記述子。
\param buf 読み取るバッファ。
\param count 読み取るバイト数。
*/
#define MAX(a,b) (((a)>(b))?(a):(b))
typedef unsigned int UINT32;
int errno;
int open(const char *,int);
int close(int);
size_t write(int,const char *, size_t);
int read(int,char *,size_t);

Doxygenが生成する対応するHTMLドキュメントはこちらをクリックしてください。

上記の例の各コメントブロックには構造コマンドが含まれているため、すべてのコメントブロックは生成されるドキュメントに影響を与えることなく、別の場所や入力ファイル(たとえばソースファイル)に移動できます。このアプローチの欠点は、プロトタイプが重複するため、すべての変更を2回行う必要があることです!このため、本当にこれが必要かどうかを最初に検討し、可能であれば構造コマンドを避けるべきです。私は関数名の前に配置されたコメントブロックに\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のコメントブロック

Pythonには、いわゆるドキュメンテーション文字列(""")を使用してコードをドキュメンテーション化する標準的な方法があります。これらの文字列は__doc__に保存され、実行時に取得できます。Doxygenはこれらのコメントを抽出し、事前フォーマットされた方法で表現される必要があると仮定します。

"""@package docstring
このモジュールのドキュメント。
詳細。
"""
def func()
"""関数のドキュメント。
詳細。
"""
pass
class PyClass
"""クラスのドキュメント。
詳細。
"""
def __init__(self)
"""コンストラクタ。"""
self._memVar = 0;
def PyMethod(self)
"""メソッドのドキュメント。"""
pass

Doxygenが生成する対応するHTMLドキュメントはこちらをクリックしてください。

"""を使用する場合、Doxygenの特殊コマンドはサポートされず、テキストはそのままのテキストとして表示されます。\verbatimを参照してください。Doxygenの特殊コマンドを使用し、テキストを"""ではなく通常のドキュメントとして表示するには、"""!を使用するか、設定ファイルでPYTHON_DOCSTRINGNOに設定してください。
"""の代わりに'''を使用することもできます。

Pythonコードをドキュメント化する別の方法として、「##」または「##<」で始まるコメントを使用する方法もあります。これらの種類のコメントブロックは、Doxygenがサポートする他の言語のドキュメントブロックの動作とより一致しており、特殊コマンドの使用も可能です。

以下に、Doxygenスタイルのコメントを使用した同じ例をもう一度示します。

## @package pyexample
# このモジュールのドキュメント。
#
# 詳細。
## 関数のドキュメント。
#
# 詳細。
def func()
pass
## クラスのドキュメント。
#
# 詳細。
class PyClass
## コンストラクタ。
def __init__(self)
self._memVar = 0;
## メソッドのドキュメント。
# @param self オブジェクトポインタ。
def PyMethod(self)
pass
## クラス変数。
classVar = 0;
## @var _memVar
# メンバー変数

Doxygenが生成する対応するHTMLドキュメントはこちらをクリックしてください。

PythonはCやC++よりもJavaに似ているため、設定ファイルでOPTIMIZE_OUTPUT_JAVAYESに設定する必要があります。

VHDLのコメントブロック

VHDLでは、コメントは通常「--」で始まります。Doxygenは「--!」で始まるコメントを抽出します。VHDLにはコメントブロックが2種類しかありません。それは、短い説明を表す1行の「--!」コメントと、詳細な説明を表す複数行の「--!」コメント(各行に「--!」プレフィックスが繰り返される)です。

コメントは、ドキュメント化されている項目の前に常に配置されますが、1つの例外があります。ポートの場合、コメントは項目の後にも配置でき、その場合、ポートの短い説明として扱われます。

Doxygenコメントを含むVHDLファイルの例を以下に示します。

-------------------------------------------------------
--! @file
--! @brief with-select を使用した2:1 Mux
-------------------------------------------------------
--! 標準ライブラリを使用
library ieee;
--! ロジック要素を使用
use ieee.std_logic_1164.all;
--! Muxエンティティの簡単な説明
--! この
--! Mux設計要素の詳細な説明。
entity mux_using_with is
port (
din_0 : in std_logic; --! Muxの最初の入力
din_1 : in std_logic; --! Muxの2番目の入力
sel : in std_logic; --! 選択入力
mux_out : out std_logic --! Muxの出力
);
end entity;
--! @brief MUXのアーキテクチャ定義
--! @details このmux要素に関する詳細。
architecture behavior of mux_using_with is
begin
with (sel) select
mux_out <= din_0 when '0',
din_1 when others;
end architecture;

Doxygenが生成する対応するHTMLドキュメントはこちらをクリックしてください。

VHDL 2008以降、/``*スタイルのコメントも使用できます。
Doxygenは/``* ... *``/を通常のコメントとして扱い、/``*! ... *``/スタイルのコメントをDoxygenによって解析される特殊コメントとして扱います。

適切な出力を得るには、設定ファイルでOPTIMIZE_OUTPUT_VHDLYESに設定する必要があります。これにより、他のいくつかの設定にも影響があります。もしそれらが正しく設定されていなかった場合、Doxygenはどの設定が上書きされたかを示す警告を生成します。

Fortranのコメントブロック

FortranコードにDoxygenを使用する場合は、OPTIMIZE_FOR_FORTRANYESに設定する必要があります。

パーサーは、ソースコードが固定形式Fortranコードか自由形式Fortranコードかを推測しようとします。これは常に正しいとは限りません。正しくない場合は、EXTENSION_MAPPINGを使用してこれを修正する必要があります。EXTENSION_MAPPING = f=FortranFixed f90=FortranFreeと設定することで、拡張子fのファイルは固定形式Fortranコードとして解釈され、拡張子f90のファイルは自由形式Fortranコードとして解釈されます。

Fortranでは、「!>」または「!<」でコメントが開始され、「!!」または「!>」で1行コメントを複数行コメントに続けることができます。

以下に、ドキュメント化されたFortranサブルーチンの例を示します。

!> 集約のための制限行列を構築します
!! メソッド。
!! @param aggr 集約に関する情報
!! @todo 特殊なケースを処理する
subroutine intrestbuild(A,aggr,Restrict,A_ghost)
implicit none
Type(SpMtx), intent(in) :: A !< 私たちの細かいレベルの行列
Type(Aggrs), intent(in) :: aggr
Type(SpMtx), intent(out) :: Restrict !< 私たちの制限行列
!...
end subroutine

代替案として、固定形式コードでコメントを使用することもできます。

C> 関数コメント
C> コメントのもう1行
function a(i)
C> 入力パラメータ
integer i
end function A

コメントブロックの構造

前のセクションでは、コード内のコメントをDoxygenに認識させる方法に焦点を当て、簡潔な説明と詳細な説明の違い、および構造コマンドの使用について説明しました。

このセクションでは、コメントブロック自体の内容について見ていきます。

Doxygenは、コメントをフォーマットするさまざまなスタイルをサポートしています。

最も単純な形式はプレーンテキストを使用することです。これは出力にそのまま表示され、短い説明に最適です。

より長い説明の場合、逐語的なテキストのブロック、リスト、単純なテーブルなど、もう少し構造が必要になることがよくあります。この目的のために、DoxygenはMarkdown構文と、Markdown Extra拡張の一部をサポートしています。

Markdownは、読み書きが非常に簡単になるように設計されています。その書式設定は、プレーンテキストメールにインスパイアされています。Markdownは、プロジェクトの紹介ページのような、単純で汎用的な書式設定に最適です。DoxygenはMarkdownファイルの直接読み込みもサポートしています。詳細については、章Markdownのサポートを参照してください。

プログラミング言語固有のフォーマットの場合、DoxygenはMarkdownフォーマットの上に2種類の追加マークアップを提供しています。

  1. Javadocのようなマークアップ。Doxygenがサポートするすべてのコマンドの完全な概要については、特殊コマンドを参照してください。
  2. C#標準で指定されているXMLマークアップ。DoxygenがサポートするXMLコマンドについては、XMLコマンドを参照してください。

それでも不十分な場合は、DoxygenはHTMLマークアップ言語のサブセットもサポートしています。

次のセクションに進むか、インデックスに戻ります。