Doxygen 内置支持为 C++ 类生成继承图。
Doxygen 可以使用 graphviz 的“dot”工具生成更高级的图表和图形。Graphviz 是一个开源、跨平台的图形绘制工具包,可在 https://graphviz.cpp.org.cn/ 找到。
如果你的路径中包含“dot”工具,你可以在配置文件中将 HAVE_DOT 设置为 YES
,让 Doxygen 使用它。
Doxygen 使用“dot”工具生成以下图形
- 将绘制类层次结构的图形表示,以及文本表示。目前此功能仅支持 HTML。
警告: 当你拥有非常大的类层次结构,其中许多类派生自一个共同的基类时,生成的图像对于某些浏览器来说可能太大而无法处理。
- 将为每个文档化的类生成一个继承图,显示直接和间接的继承关系。这将禁用内置类继承图的生成。
- 将为每个至少包含一个其他文件的文档化文件生成一个包含依赖图。目前此功能仅支持 HTML 和 RTF。
- 还将生成一个反向包含依赖图,显示对于一个(头)文件,哪些其他文件包含它。
- 为每个文档化的类和结构体绘制一个图,显示
- 与基类的继承关系。
- 与其他结构体和类的使用关系(例如,类
A
有一个类型为类 B
的成员变量 m_a
,则 A
有一个指向 B
的箭头,并以 m_a
作为标签)。
- 如果 CALL_GRAPH 设置为 YES,则为每个函数绘制一个图形调用图,显示该函数直接或间接调用的函数(另请参阅 \callgraph 部分和 \hidecallgraph 部分)。
- 如果 CALLER_GRAPH 设置为 YES,则为每个函数绘制一个图形调用者图,显示直接或间接调用该函数的函数(另请参阅 \callergraph 部分和 \hidecallergraph 部分)。
- 如果 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
来生成图表。
前往下一部分或返回索引。