C++ Doxygen 注释规范详解

Doxygen 是 C++ 中最常用的文档生成工具,以下是完整的注释规范指南。

1. 基本注释格式

1.1 三种注释风格

/// 单行注释(推荐)
/** 多行注释块 */
/*! 另一种多行注释 */

1.2 推荐的文件头注释

/**
 * @file    MyClass.h
 * @brief   简要描述文件功能
 * @author  作者名
 * @date    创建日期
 * @version 版本号
 * 
 * @details 详细描述文件功能和使用方法
 * 
 * @copyright 版权信息
 */

2. 函数注释规范

2.1 基本函数注释

/**
 * @brief 计算两个数的和
 * 
 * @param a 第一个加数
 * @param b 第二个加数
 * @return int 两个数的和
 * 
 * @note 此函数不检查溢出
 * @warning 参数不能为负数
 * @see subtract(), multiply()
 */
int add(int a, int b) {
    return a + b;
}

2.2 重载函数注释

/**
 * @brief 计算两个浮点数的和
 * @overload
 */
double add(double a, double b);

2.3 模板函数注释

/**
 * @brief 泛型加法函数
 * 
 * @tparam T 数值类型,必须支持+操作符
 * @param a 第一个加数
 * @param b 第二个加数
 * @return T 两个数的和
 */
template<typename T>
T add(T a, T b) {
    return a + b;
}

3. 类注释规范

3.1 类定义注释

/**
 * @brief 表示二维空间中的点
 * 
 * 这个类提供了二维坐标系中点的基本操作,
 * 包括移动、计算距离等功能。
 */
class Point {
public:
    /**
     * @brief 默认构造函数
     * @post 创建坐标为(0,0)的点
     */
    Point();
  
    /**
     * @brief 带参数构造函数
     * @param x X坐标
     * @param y Y坐标
     */
    Point(double x, double y);
  
    /// @brief 获取X坐标
    double getX() const;
  
    /// @brief 获取Y坐标  
    double getY() const;
  
private:
    double x_; ///< X坐标值
    double y_; ///< Y坐标值
};

3.2 继承关系注释

/**
 * @brief 表示三维空间中的点
 * @extends Point
 */
class Point3D : public Point {
    // ...
};

4. 枚举和结构体注释

4.1 枚举注释

/**
 * @brief 颜色枚举定义
 */
enum class Color {
    RED,    ///< 红色
    GREEN,  ///< 绿色  
    BLUE    ///< 蓝色
};

4.2 结构体注释

/**
 * @brief 表示人员信息的数据结构
 */
struct Person {
    std::string name;     ///< 姓名
    int age;             ///< 年龄
    std::string address; ///< 地址
};

5. 命名空间注释

/**
 * @brief 数学工具命名空间
 * 
 * 包含各种数学计算相关的函数和类
 */
namespace MathUtils {
    // ...
}<

6. 常用Doxygen命令详解

6.1 基本命令

命令说明示例
@brief简要描述@brief 计算平方根
@details详细描述@details 使用牛顿迭代法...
@param参数说明@param x 输入数值
@return返回值说明@return 计算结果
@tparam模板参数@tparam T 元素类型

6.2 高级命令

/**
 * @brief 复杂的函数示例
 * 
 * @param[in] input 输入参数(只读)
 * @param[out] output 输出参数(写入结果)
 * @param[in,out] inout 输入输出参数
 * 
 * @return 操作结果
 * @retval 0 成功
 * @retval -1 失败
 * 
 * @throw std::invalid_argument 当输入无效时
 * @exception std::runtime_error 运行时错误
 * 
 * @pre input != nullptr
 * @post output 包含有效结果
 * 
 * @note 此函数线程安全
 * @warning 需要手动释放内存
 * @bug 已知问题描述
 * @todo 待完成功能
 * 
 * @deprecated 使用新函数代替
 * 
 * @see relatedFunction()
 * @cite 参考文献
 * 
 * @code
 * // 使用示例
 * int result = function(input, output);
 * @endcode
 */
int function(const int* input, int* output);

6.3 条件编译注释

#if defined(DEBUG)
/**
 * @brief 调试版本特有的函数
 * @debug 仅在调试模式下可用
 */
void debugFunction();
#endif

7. 格式化标记

7.1 文本格式化

/**
 * @brief 格式化示例
 * 
 * 这是普通文本
 * 
 * - 项目符号1
 * - 项目符号2
 * 
 * 1. 编号列表1
 * 2. 编号列表2
 * 
 * 这是<b>粗体</b>文本
 * 这是<em>斜体</em>文本
 * 
 * 行内代码:@c variableName
 * 代码块:
 * @code{.cpp}
 * int x = 42;
 * std::cout << x << std::endl;
 * @endcode
 * 
 * 数学公式:
 * 行内公式 @f$ E = mc^2 @f$
 * 块公式:
 * @f[
 *   \int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
 * @f]
 * 
 * 链接:<a href="http://example.com">链接文本</a>
 */

8. 实际完整示例

8.1 完整的类示例

/**
 * @file    Vector.h
 * @brief   动态数组容器实现
 * @author  Developer
 * @date    2024-01-01
 * @version 1.0
 */

#ifndef VECTOR_H
#define VECTOR_H

#include <stdexcept>

/**
 * @brief 泛型动态数组容器
 * @tparam T 数组中元素的类型
 * 
 * 这个类提供了类似std::vector的功能,但实现更简单。
 * 支持动态扩容、随机访问等操作。
 */
template<typename T>
class Vector {
public:
    /**
     * @brief 默认构造函数
     * @post 创建容量为10的空向量
     */
    Vector();
  
    /**
     * @brief 带初始容量的构造函数
     * @param capacity 初始容量
     * @throw std::invalid_argument 如果capacity <= 0
     */
    explicit Vector(size_t capacity);
  
    /**
     * @brief 拷贝构造函数
     * @param other 要拷贝的向量
     */
    Vector(const Vector& other);
  
    /**
     * @brief 析构函数
     */
    ~Vector();
  
    /**
     * @brief 在末尾添加元素
     * @param value 要添加的值
     * @post 如果容量不足,自动扩容
     */
    void push_back(const T& value);
  
    /**
     * @brief 获取指定位置的元素
     * @param index 元素索引(0-based)
     * @return const T& 元素的常量引用
     * @throw std::out_of_range 如果index >= size()
     */
    const T& at(size_t index) const;
  
    /**
     * @brief 获取向量当前大小
     * @return size_t 元素数量
     */
    size_t size() const;
  
    /**
     * @brief 获取向量容量
     * @return size_t 当前容量
     */
    size_t capacity() const;
  
    /**
     * @brief 检查向量是否为空
     * @return bool 如果为空返回true
     */
    bool empty() const;

private:
    T* data_;           ///< 数据数组指针
    size_t size_;       ///< 当前元素数量
    size_t capacity_;   ///< 当前容量
  
    /**
     * @brief 扩容向量
     * @param new_capacity 新的容量
     * @post 容量至少变为原来的2倍
     */
    void resize(size_t new_capacity);
};

#endif

9. Doxygen配置文件建议

Doxyfile中设置以下重要选项:

PROJECT_NAME           = "My Project"
PROJECT_NUMBER         = 1.0
OUTPUT_DIRECTORY       = docs/
INPUT                  = src/
RECURSIVE              = YES
FILE_PATTERNS          = *.h *.hpp *.cpp *.c
EXTRACT_ALL            = YES
EXTRACT_PRIVATE        = YES
EXTRACT_STATIC         = YES
SOURCE_BROWSER         = YES
GENERATE_LATEX         = NO
GENERATE_HTML          = YES

10. 最佳实践

  1. 一致性:整个项目保持统一的注释风格
  2. 及时更新:代码修改时同步更新注释
  3. 简明扼要:注释要简洁明了,避免冗长
  4. 英文优先:国际项目建议使用英文注释
  5. 版本控制:重要的API变更要更新版本信息

通过遵循这些规范,可以生成专业、易读的API文档,提高代码的可维护性。