本文简单介绍 linux 下 doxygen 的安装和注释规则.
简介
doxygen 是一个程序化生成代码文档的工具, 适用于 C++, Python 等语言.
按照 doxygen 的格式给程序写注释, 就可以通过 doxygen 处理为详细的代码文档.
安装
linux
sudo apt install graphviz
sudo apt install doxygen
doxygen 注释规则
Doxygen 可以用于 C++ 和 Python 等语言的程序, 只会处理符合规则的注释.
C++ 注释规则
- 多行注释
    
/** 注释内容 * */ - 单行注释
    
/** 注释内容 */注意: Doxygen 默认注释是说明下面的代码, 如:
/** 两个整数相加 * */ int add(int a, int b) { return a+b; }若要注释上面的代码用
/**< 注释内容 */如:
int a = 3; /**< 将 a 设为 3 */Python 注释规则
 - 简单注释
    
'''! 注释内容''' 
常见注释标记
在注释内容中通过加入一些标记来规范的写注释.
- 文件信息
    
\file文件名\date日期\author作者\brief文件或函数的摘要\todoTODO
 - 函数信息
    
\param[int]输入参数的说明\param[out]输出参数的说明\param[in, out]即输入又输出参数的说明\return返回值说明\note注解, 用来描述函数的流程或注疑事项\code示例代码开始\endcode示例代码结束
 - 特殊标记
    
\f[输入 latex 公式\f]结束 latex 公式
 
以上是 C++ 风格注释, Python 程序中将 \ 改为 @ 即可.
例子
C++ 程序例子
/**
 * \file test_TetrahedronQuadrature.cpp
 * \author Chunyu Chen
 * \date 2021/09/08
 * \brief TetrahedronQuadrature.h 测试文件
 */
#include <array>
#include <vector>
#include <algorithm>
#include <math.h>
#include "TestMacro.h"
#include "geometry/Point_3.h"
#include "geometry/Vector_3.h"
#include "quadrature/TetrahedronQuadrature.h"
typedef WHYSC::GeometryObject::Point_3<double> Point;
typedef WHYSC::Quadrature::TetrahedronQuadrature TetrahedronQuadrature;
/** 
 * \brief 被积函数
 * \param p 函数的参数
 */
double f(const Point & p)
{
  return p[0];//p[0]*p[1];
}
/**
 * \brief 四面体类, 即积分区域
 */
struct Tetrahedron
{
  Point p0, p1, p2, p3; /**< 四面体顶点 */
  /**
   * \brief 四面体面积
   */
  double area()
  {
    auto v1 = p1 - p0;
    auto v2 = p2 - p0;
    auto v3 = p3 - p0;
    return std::abs(dot(cross(v1, v2), v3)/6);
  }
};
/**
 * \brief 积分测试函数
 */
void test_integral(int p = 3, double h = 0.5)
{
  Tetrahedron tet;
  tet.p0 = Point({0, 0, 0});
  tet.p1 = Point({h, 0, 0});
  tet.p2 = Point({0, h, 0});
  tet.p3 = Point({0, 0, h});
  
  TetrahedronQuadrature tetQ(p);
  int NQP = tetQ.number_of_quadrature_points();
  double val = 0.0;
  for(int i = 0; i < NQP; i++)
  {
    auto w = tetQ.quadrature_weight(i);
    auto & qpts = tetQ.quadrature_point(i);
    auto P = qpts[0]*tet.p0 + qpts[1]*tet.p1 + qpts[2]*tet.p2 + qpts[3]*tet.p3; 
    val += f(P)*w;
  }
  val *= tet.area();
  ASSERT_THROW(std::abs(val-std::pow(h, 5)/12.0)<1e-10);/**< 判断积分是否正确 */
}
int main(int args, char *argv[])
{
  int q = 4;
  double h = 0.5;
  if(args>1 && args<3)
     q = std::stoi(argv[1]);
  else if(args>=3)
  {
     q = std::stoi(argv[1]);
     h = std::stoi(argv[2]);
  }
  test_integral(q, h);
}
Python 程序例子
'''!
@file test.py
@author chenchunyu
@date 10/03/2021
@brief 一个测试文件
'''
import numpy as np
class Test:
    '''!
    @brief 测试类
    @todo 完善
    '''
    def __init__(self, a, b):
        '''!
        @brief 初始化函数, 构造对象时调用的函数.
        @param a 第一个参数
        @param b 第二个参数
        '''
        self.a = a
        self.b = b
    def add(self, k, b):
        '''!
        @brief 一个测试函数, 计算 @f[kx+by@f]
        @param k 第一个参数
        @param b 第一个参数
        @return 返回 k*self.a + b*self.b
        '''
        return k*self.a + b*self.b
文件生成
- 生成 Doxyfile
    
doxygen -g - 修改设置, 打开 Doxyfile, 设置
    
USE_MATHJAX = YESGENERATE_LATEX = NO- 文件位置
 
 - 生成 HTML 文件
    
doxygen - 查看 HTML 文件
    
jekyll serve