用doxygen生成类似OpenFOAM的继承关系图和接口手册

生成用的指令

  1. doxygen -g Doxygen.config : 会在当前路径下生成一个Doxygen.config Doxygen.config文件里面有个选项HAVE_DOT推荐打开(不打开就是OpenFOAM那种类图,成员变量和函数较多的时候就不打开了),打开了里面有详细的函数。

更多设置就要研究这个Doxygen.config啦

  1. doxygen Doxigen.config:当前路径生成了html
  2. 如果在linux下firefox ./html/index.html打开,windows直接网页打开,就可以看到了

生成后的(代码中按照一定的注释规范,doxygen会自动识别):

图1

这个图就和OpenFOAM的API Guide一样啦

The OpenFOAM Source Code Guide | OpenFOAM v7 | The OpenFOAM Foundation

以前刚开始学OpenFOAM,既不会C++也不会Doxygen,看API Guide简直是痛苦-0 -。 现在自己写个类试一试用doxygen生成一下,对阅读OpenFOAM的API Guide也有帮助(最近在写一个类,感觉类的设计简直是个规则类怪谈= =!,等哪天整理整理发出来乐呵一下)

图2

通过API Guide来看OpenFOAM

以一个OpenFOAM求解器常用的类来看,createFields.H中的fvMesh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// createFields.H 
Foam::Info
<< "Create mesh for time = "
<< runTime.timeName() << Foam::nl << Foam::endl;

Foam::fvMesh mesh
(
Foam::IOobject
(
Foam::fvMesh::defaultRegion,
runTime.timeName(),
runTime,
Foam::IOobject::MUST_READ
)
);

fvMesh 这个类继承了PrimitiveMeshpolyMesh

image-20230926204031953

image-20230926203313291

继续看PrimitiveMeshpolyMesh可以发现在顶层的PrimitiveMesh,有许多函数定义为virtual xxx xxxx = 0;定义成了纯虚的接口,意味着实现应该去他的子类去找。当然,子类也可以用父类已经实现了的函数,所以有时在OpenFOAM找具体在哪儿实现的要套好几层。

看到想用的函数是pure virtual,去他的子类找吧~~

image-20230926204825049

生成doxygen手册测试用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* @file main.cpp
* @brief This is a simple C++ program demonstrating Doxygen documentation.
*/

#include <iostream>

/**
* @brief The base class with a static variable and function.
*/
class Base {
public:
static int staticVar; /**< A static variable. */

/**
* @brief A static function to get the static variable.
* @return The static variable.
*/
static int getStaticVar() {
return staticVar;
}

/**
* @brief A virtual function that prints a message.
*/
virtual void printMessage() {
std::cout << "Base class message." << std::endl;
}

/**
* @brief The base class constructor.
*/
Base() {
std::cout << "Base class constructor." << std::endl;
}

/**
* @brief The base class destructor.
*/
virtual ~Base() {
std::cout << "Base class destructor." << std::endl;
}
};

int Base::staticVar = 10; // Initialize static variable

/**
* @brief The derived class that inherits from Base.
*/
class Derived : public Base {
public:
/**
* @brief A function that prints a different message.
*/
void printMessage() override {
std::cout << "Derived class message." << std::endl;
}

/**
* @brief The derived class constructor.
*/
Derived() {
std::cout << "Derived class constructor." << std::endl;
}

/**
* @brief The derived class destructor.
*/
~Derived() override {
std::cout << "Derived class destructor." << std::endl;
}
};