Doxygen 內建支援為 C++ 類別產生繼承圖。
Doxygen 可以使用 graphviz 的「dot」工具來產生更進階的圖表和圖形。Graphviz 是一個開源、跨平台的圖形繪製工具組,可以在 https://graphviz.dev.org.tw/ 找到。
如果您的路徑中有「dot」工具,您可以在設定檔中將 HAVE_DOT 設定為 YES
,讓 Doxygen 使用它。
Doxygen 使用「dot」工具來產生以下圖形
- 將會繪製類別階層的圖形表示,以及文字表示。目前此功能僅支援 HTML。
警告:當您有非常大的類別階層,其中許多類別繼承自一個共同的基底類別時,產生的圖像可能會變得太大,導致某些瀏覽器無法處理。
- 將為每個有文件的類別產生繼承圖,顯示直接和間接的繼承關係。這會停用內建類別繼承圖的產生。
- 為每個包含至少一個其他檔案的文件產生包含相依性圖。此功能目前僅支援 HTML 和 RTF。
- 也會產生反向包含相依性圖,顯示對於一個(標頭)檔案,哪些其他檔案包含它。
- 為每個有文件的類別和結構繪製圖形,顯示
- 與基底類別的繼承關係。
- 與其他結構和類別的使用關係(例如,類別
A
有一個類型為類別 B
的成員變數 m_a
,則 A
有一個指向 B
的箭頭,標籤為 m_a
)。
- 如果 CALL_GRAPH 設定為 YES,則會為每個函數繪製圖形化的呼叫圖,顯示函數直接或間接呼叫的函數(另請參閱 呼叫圖 和 隱藏呼叫圖 小節)。
- 如果 CALLER_GRAPH 設定為 YES,則會為每個函數繪製圖形化的呼叫者圖,顯示函數直接或間接被哪些函數呼叫(另請參閱 呼叫者圖 和 隱藏呼叫者圖 小節)。
- 如果 DIRECTORY_GRAPH 設定為
YES
,Doxygen 將為每個目錄產生顯示目錄相依性的圖。圖形將目錄顯示為方塊。子目錄會巢狀顯示在其父目錄的方塊中。圖形的深度透過 DIR_GRAPH_MAX_DEPTH 設定。目錄之間的包含相依性顯示為箭頭。
使用 版面配置檔案,您可以決定實際顯示哪些圖形。
選項 DOT_GRAPH_MAX_NODES 和 MAX_DOT_GRAPH_DEPTH 可用於限制各種圖形的大小。
HTML 和 RTF 中類別圖中的元素具有以下含義
- 黃色方塊表示類別。方塊的右下角可能有一個小標記,表示該類別包含隱藏的基底類別。對於類別圖,目前最大的樹狀寬度為 8 個元素。如果樹狀結構更寬,則會隱藏某些節點。如果方塊填充虛線圖案,則表示繼承關係是虛擬的。
- 白色方塊表示目前顯示該類別的文件。
- 灰色方塊表示未記錄的類別。
- 實心深藍色箭頭表示公有繼承。
- 虛線深綠色箭頭表示受保護的繼承。
- 點狀深綠色箭頭表示私有繼承。
中類別圖中的元素具有以下含義
- 白色方塊表示類別。方塊右下角的標記表示該類別有隱藏的基底類別。如果方塊具有虛線邊框,則表示虛擬繼承。
- 實心箭頭表示公有繼承。
- 虛線箭頭表示受保護的繼承。
- 點狀箭頭表示私有繼承。
由 dot 工具產生的圖形中的元素具有以下含義
- 白色方塊表示類別或結構或檔案。
- 具有紅色邊框的方塊表示節點具有比顯示的更多箭頭!換句話說:該圖相對於此節點是截斷的。有時截斷圖形的原因是防止圖像變得太大。對於使用 dot 產生的圖形,Doxygen 嘗試將結果圖像的寬度限制為 1024 像素。
- 黑色方塊表示目前顯示該類別的文件。
- 深藍色箭頭表示包含關係(對於包含相依性圖)或公有繼承(對於其他圖形)。
- 深綠色箭頭表示受保護的繼承。
- 深紅色箭頭表示私有繼承。
- 紫色虛線箭頭表示「使用」關係,箭頭邊緣標示了造成該關係的變數。如果類別
A
有一個類型為 C 的成員變數 m
,其中 B 是 C 的子類型(例如,C
可以是 B
、B*
、T<B>*
),則類別 A
使用類別 B
。
目錄相依性圖中的元素具有以下含義
- 具有粗體邊框的方塊表示已產生目錄相依性圖的目錄。
- 具有紅色實心邊框的方塊表示其子目錄未顯示在圖中的目錄(「已截斷」)。若要設定顯示在圖中的子目錄深度,請參閱 DIR_GRAPH_MAX_DEPTH。
- 具有紅色虛線邊框的方塊表示已截斷的目錄,其父目錄也不會顯示在圖中。
- 具有非紅色虛線邊框的方塊表示顯示了至少一個子目錄,但不是全部。
- 具有淺灰色邊框的方塊表示同時具有以下兩個屬性的目錄
- 沒有背景顏色的方塊表示不是顯示之原始父目錄的子目錄的目錄。原始目錄是指顯示目錄相依性圖的目錄。
- 兩個方塊之間的箭頭表示兩個目錄之間的包含相依性。如果一個目錄中的檔案包含另一個目錄中的檔案,則存在包含相依性。如果圖形中未顯示涉及包含相依性的目錄,則箭頭會連接到顯示的第一個父目錄。此父目錄會顯示為已截斷(見上文)。
以下是一些標頭檔,它們一起顯示 Doxygen 可以產生的各種示意圖
diagrams_a.h
#ifndef DIAGRAMS_A_H
#define DIAGRAMS_A_H
class A { public: A *m_self; };
#endif
diagrams_b.h
#ifndef DIAGRAMS_B_H
#define DIAGRAMS_B_H
class A;
class B { public: A *m_a; };
#endif
diagrams_c.h
#ifndef DIAGRAMS_C_H
#define DIAGRAMS_C_H
#include "diagrams_c.h"
class D;
class C : public A { public: D *m_d; };
#endif
diagrams_d.h
#ifndef DIAGRAM_D_H
#define DIAGRAM_D_H
#include "diagrams_a.h"
#include "diagrams_b.h"
class C;
class D : virtual protected A, private B { public: C m_c; };
#endif
diagrams_e.h
#ifndef DIAGRAM_E_H
#define DIAGRAM_E_H
#include "diagrams_d.h"
class E : public D {};
#endif
按一下這裡以查看 Doxygen 產生的對應 HTML 文件。請注意,EXTRACT_ALL =
YES
用於產生示意圖。
前往下一節或返回索引。