Doxygenには、ものをグループ化するための3つのメカニズムがあります。1つ目のメカニズムはグローバルレベルで機能し、各グループに対して新しいページを作成します。これらのグループは、ドキュメントでは'トピック'と呼ばれます。2つ目のメカニズムは、複合エンティティのメンバリスト内で機能し、'メンバグループ'と呼ばれます。ページには、サブページングと呼ばれる3つ目のグルーピングメカニズムがあります。
グルーピングとは、トピックと呼ばれる個別のページに複数のものをまとめてグループ化する方法です。グループ全体を文書化することも、個々のメンバをすべて文書化することもできます。グループのメンバには、ファイル、名前空間、クラス、コンセプト、モジュール、関数、変数、列挙型、typedef、defineなどが含まれますが、他のグループも含まれます。
グループを定義するには、特別なコメントブロック内に\defgroupコマンドを記述する必要があります。コマンドの最初の引数は、グループを一意に識別するラベルです。2番目の引数は、ドキュメントに表示されるグループの名前またはタイトルです。
特定のグループにエンティティをメンバとして追加するには、そのドキュメントブロック内に\ingroupコマンドを記述します。
各メンバのドキュメントに\ingroupコマンドを記述するのを避けるために、グループの前に開始マーカー@{
、グループの後に終了マーカー@}
を付けてメンバをグループ化することもできます。これらのマーカーは、グループ定義のドキュメントまたは個別のドキュメントブロックに配置できます。
これらのグルーピングマーカーを使用すると、グループ自体をネストすることもできます。
同じグループラベルを複数回使用すると、エラーメッセージが表示されます。Doxygenに一意のラベルを強制させたくない場合は、\defgroupの代わりに\addtogroupを使用できます。これは\defgroupとまったく同じように使用できますが、グループが既に定義されている場合は、既存のドキュメントと新しいドキュメントを黙ってマージします。このコマンドではグループのタイトルはオプションであるため、次のように使用できます。
/** \addtogroup <label> * @{ */ ... /** @}*/
別の場所で詳細に定義されているグループに、追加のメンバを追加します。
複合エンティティ(クラス、ファイル、名前空間など)は複数のグループに入れることができますが、メンバ(変数、関数、typedef、列挙型など)は1つのグループのメンバにしかなれないことに注意してください(この制限は、メンバがそのクラス、名前空間、またはファイルのコンテキストで文書化されておらず、グループの一部としてのみ可視である場合に、曖昧なリンクターゲットを回避するために設けられています)。
Doxygenは、定義の「優先度」が最も高いグループにメンバを配置します。たとえば、明示的な\ingroupは、@{
@}
を介した暗黙のグルーピング定義を上書きします。同じ優先度のグルーピング定義が競合する場合、一方の定義が明示的なドキュメントを持たないメンバのものでない限り、警告がトリガされます。
以下の例では、VarInAをグループAに入れ、IntegerVariableの2番目のインスタンスが文書化されていないため、IntegerVariableの競合を黙って解決し、IntVariablesグループに入れます。
/** * \ingroup A */ extern int VarInA; /** * \defgroup IntVariables Global integer variables * @{ */ /** an integer variable */ extern int IntegerVariable; /**@}*/ .... /** * \defgroup Variables Global variables */ /**@{*/ /** a variable in group A */ int VarInA; int IntegerVariable; /**@}*/
\refコマンドはグループを参照するために使用できます。\refコマンドの最初の引数はグループのラベルである必要があります。カスタムリンク名を使用するには、以下の例に示すように、ラベルの後にリンク名を二重引用符で囲んで記述します。
This is the \ref group_label "link" to this group.
グルーピング定義の優先度は(高い順に):\ingroup、\defgroup、\addtogroup、\weakgroupです。\weakgroupコマンドは、優先度が低いことを除いて\addtogroupとまったく同じです。これは「怠惰な」グルーピング定義を可能にするために追加されました。つまり、.hファイルでより高い優先度のコマンドを使用して階層を定義し、.cファイルで\weakgroupを使用することで、階層を正確に複製する必要がなくなります。
Doxygenによって生成された対応するHTMLドキュメントはこちらをクリックしてください。
複合体(クラスやファイルなど)に多くのメンバがある場合、それらをまとめてグループ化したいと考えることがよくあります。Doxygenはすでに型と保護レベルに基づいて自動的にグループ化を行いますが、これが十分でない、またはデフォルトのグループ化が間違っていると感じるかもしれません。たとえば、異なる(構文的な)型のメンバが同じ(意味的な)グループに属すると感じる場合などです。
メンバグループは、
///@{ ... ///@}
ブロック、または
/**@{*/ ... /**@}*/
Cスタイルのコメントを好む場合はブロックで定義されます。グループのメンバは、メンバグループの本体内に物理的に配置されている必要があることに注意してください。
ブロックの開始マーカーの前に、個別のコメントブロックを配置できます。このブロックには、@name(または\name)コマンドが含まれるべきで、グループのヘッダを指定するために使用されます。オプションとして、このコメントブロックにはグループに関するより詳細な情報を含めることもできます。
メンバグループのネストは許可されていません。
クラス内のメンバグループのすべてのメンバが同じ型と保護レベルを持つ場合(例えば、すべてが静的パブリックメンバである場合)、メンバグループ全体は型/保護レベルグループのサブグループとして表示されます(たとえば、「Static Public Members」セクションのサブセクションとしてグループが表示されます)。2つ以上のメンバが異なる型を持つ場合、そのグループは自動生成されたグループと同じレベルに配置されます。クラスのすべてのメンバグループを最上位レベルに強制したい場合は、クラスのドキュメント内に\nosubgroupingコマンドを配置する必要があります。
Doxygenによって生成された対応するHTMLドキュメントはこちらをクリックしてください。
ここでは、Group1は「Public Members」のサブセクションとして表示されます。そしてGroup2は、異なる保護レベル(すなわちpublicとprotected)を持つメンバが含まれているため、別のセクションとして表示されます。
情報は、\pageおよび\mainpageコマンドを使用してページにグループ化できます。通常、これによりページのフラットなリストが生成され、「メイン」ページがリストの最初に配置されます。
トピックセクションで説明されているアプローチで構造を追加する代わりに、\subpageコマンドを使用してページに追加の構造を追加する方が、より自然で便利であることがよくあります。
ページAの場合、\subpageコマンドは別のページBへのリンクを追加すると同時に、ページBをAのサブページにします。これにより、GBがGAの一部である2つのグループGAとGBが作成され、ページAはグループGAに、ページBはグループGBに配置される効果があります。