为什么使用 Doxygen?
- 自动化:你只需要专注于写注释,Doxygen 会自动提取信息并生成文档。
- 标准化:遵循 Doxygen 的注释规范,可以确保文档风格统一、专业。
- 同步更新:代码和文档在同一个文件中,当代码修改时,文档也更容易同步更新。
- 交叉引用:可以自动生成函数调用关系、类继承关系等,方便理解代码结构。
- 多格式输出:支持 HTML、LaTeX(用于生成 PDF)、RTF、XML、CHM 等多种格式。
Doxygen 注释风格
Doxygen 支持多种注释风格,对于 C 语言,最常用的是:

- (C++ 风格的单行注释)
- (C 风格的块注释,推荐,兼容性最好)
- (C++ 风格的单行注释,需要配置启用)
强烈推荐使用 `/ ... */` 风格**,因为它在纯 C 和 C++ 环境下都能被正确识别。
Doxygen 标记(Commands/Tags)
Doxygen 通过特定的标记(以 或 \ 开头)来解析注释内容,以下是一些最核心、最常用的标记:
| 标记 | 描述 | 示例 |
|---|---|---|
| @brief | 简要描述,通常放在注释开头。 | /** @brief 计算两个整数的和。 */ |
| @param | 描述函数的参数,格式:@param [in/out] 参数名 描述。 |
/** @param a 第一个加数。 @param b 第二个加数。 */ |
| @return | 描述函数的返回值。 | /** @return 返回 a 和 b 的和。 */ |
| @note | 添加一个注意说明。 | /** @note 此函数不处理溢出情况。 */ |
| @warning | 添加一个警告。 | /** @warning 输入指针不能为 NULL。 */ |
| @see | 引用其他相关项(如函数、宏)。 | /** @see subtract() 函数。 */ |
| @code ... @endcode | 在注释中插入代码块。 | /** @code int result = add(1, 2); @endcode */ |
| @file | 文件注释,描述整个文件,通常放在文件开头。 | /** @file calculator.h @brief 一个简单的计算器库头文件。 */ |
| @defgroup | 定义一个逻辑组,用于组织相关的函数、宏等。 | /** @defgroup CALC_UTILS 计算工具集 @brief 提供基本的数学运算函数。 @{ ... @} */ |
| @ingroup | 将一个函数或宏添加到某个已定义的组中。 | /** @ingroup CALC_UTILS */ |
与 @defgroup 配对使用,标记组的开始和结束。 |
见 @defgroup 示例。 |
|
| @author | 作者信息。 | /** @author John Doe */ |
| @version | 版本信息。 | /** @version 1.0 */ |
| @date | 日期信息。 | /** @date 2025-10-27 */ |
| @def | 描述一个宏定义。 | /** @def MAX_VALUE @brief 定义一个最大值常量。 */ |
完整 C 语言示例
我们创建一个简单的 C 语言项目,包含一个头文件和一个源文件,并为其编写 Doxygen 注释。
项目结构
my_project/
├── Doxyfile (Doxygen 配置文件)
├── src/
│ ├── calculator.c (源文件)
│ └── calculator.h (头文件)
└── docs/ (存放生成的文档)
步骤 1: 编写头文件 calculator.h
/**
* @file calculator.h
* @author Jane Smith
* @version 1.1
* @date 2025-10-27
* @brief 一个简单的计算器库头文件。
*
* 这个文件提供了基本的加、减、乘、除运算函数。
* @note 所有函数都假定输入参数是有效的。
*/
#ifndef CALCULATOR_H
#define CALCULATOR_H
/**
* @defgroup CALC_UTILS 计算工具集
* @brief 提供基本的数学运算函数。
* @{
*/
/**
* @brief 计算两个整数的和。
*
* 这是一个简单的加法函数。
* @param a 第一个加数。
* @param b 第二个加数。
* @return 返回 a 和 b 的和。
*/
int add(int a, int b);
/**
* @brief 计算两个整数的差。
*
* @param a 被减数。
* @param b 减数。
* @return 返回 a 减去 b 的差。
* @warning 此函数可能导致整数下溢。
*/
int subtract(int a, int b);
/**
* @brief 计算两个整数的乘积。
* @param a 第一个乘数。
* @param b 第二个乘数。
* @return 返回 a 和 b 的乘积。
*/
int multiply(int a, int b);
/**
* @brief 计算两个整数的商。
*
* @param a 被除数。
* @param b 除数。
* @return 返回 a 除以 b 的商。
* @note 除数 b 不能为零,否则行为未定义。
*/
int divide(int a, int b);
/** @} */ // 结束 CALC_UTILS 组
#endif // CALCULATOR_H
步骤 2: 编写源文件 calculator.c
/**
* @file calculator.c
* @author Jane Smith
* @version 1.1
* @date 2025-10-27
* @brief 计算器库的实现文件。
*/
#include "calculator.h"
#include <stdio.h> // 用于示例中的打印
// 实现细节的注释可以相对简单,但也要清晰
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int divide(int a, int b) {
// 在实现中处理错误情况是好的实践
if (b == 0) {
printf("Error: Division by zero!\n");
return 0; // 或者返回一个错误码
}
return a / b;
}
步骤 3: 生成 Doxygen 配置文件 Doxyfile
在项目根目录 my_project/ 下,打开终端,运行以下命令,Doxygen 会生成一个默认的配置文件 Doxyfile。

doxygen -g Doxyfile
步骤 4: 编辑 Doxyfile 配置文件
这是最关键的一步,你需要编辑 Doxyfile 来告诉 Doxygen 你的项目信息,用任何文本编辑器打开它,找到并修改以下几行:
# 项目名称,将显示在文档的标题栏 PROJECT_NAME = "My Awesome C Project" # 项目简介 PROJECT_NUMBER = 1.1 # 输出目录 OUTPUT_DIRECTORY = docs # 输入文件所在的目录,如果有多个,用空格隔开。 INPUT = src/calculator.h src/calculator.c # 指定哪些文件需要被解析。*.c 和 *.h 是必须的。 FILE_PATTERNS = *.c *.h # Doxygen 会从输入文件中提取的文件扩展名 EXTRACT_ALL = YES # 强制为所有实体(即使没有注释)生成文档 EXTRACT_PRIVATE = NO # 不包含私有成员(C中不常用,但可以设置) EXTRACT_STATIC = YES # 包含静态函数 EXTRACT_ANON_NSPACES = NO # 不包含匿名命名空间 # 启用 C 预处理,这样 Doxygen 能看到宏定义 ENABLE_PREPROCESSING = YES # 源代码的文件名,会在文档中显示 SOURCE_BROWSER = YES # 生成调用图和调用关系图 CALL_GRAPH = YES CALLER_GRAPH = YES # 启用 LaTeX 输出,用于生成 PDF GENERATE_LATEX = NO
关键点解释:
INPUT: 这是最重要的配置项,告诉 Doxygen 你的源代码在哪里,确保路径正确。FILE_PATTERNS: 告诉 Doxygen 只处理.c和.h文件。EXTRACT_ALL: 设置为YES非常有用,这样即使你忘记给某个函数写注释,Doxygen 也会为它生成一个基本的条目,方便你后续补充。ENABLE_PREPROCESSING: 设置为YES可以让 Doxygen 处理#define等宏。
步骤 5: 生成文档
在项目根目录 my_project/ 下,运行以下命令:
doxygen Doxyfile
如果一切顺利,Doxygen 会输出一系列信息,告诉你它正在处理哪些文件,并最终在 docs/ 目录下生成文档。

步骤 6: 查看文档
进入 docs/ 目录,你会看到几个文件夹,其中最重要的是 html/,打开 html/index.html 文件,你就可以在浏览器中看到生成的漂亮文档了。
高级技巧
为宏添加文档
对于宏,你需要使用 @def 标记。
/** * @def BUFFER_SIZE * @brief 定义输入缓冲区的最大大小。 */ #define BUFFER_SIZE 1024
使用 @defgroup 组织代码
在 calculator.h 的例子中,我们已经使用了 @defgroup,这会将 add, subtract, multiply, divide 这四个函数组织到一个名为 "计算工具集" 的逻辑组中,在生成的 HTML 文档中,会有一个专门的页面来展示这个组,方便用户浏览。
文档文件结构
对于大型项目,最好创建一个专门的 README.md 或 mainpage.md 文件作为文档的主页。
-
在
Doxyfile中设置:USE_MDFILE_AS_MAINPAGE = README.md
-
创建
README.md文件,并使用 Doxygen 标记来格式化内容。# My Awesome C Project @tableofcontents ## 简介 这是一个使用 Doxygen 文档化的 C 语言示例项目。 ## 模块 - @subpage CALC_UTILS "计算工具集"
这将创建一个带有目录和模块链接的主页。
使用 Doxygen 为 C 语言项目写文档,核心流程就是:
- 写代码:同时编写符合 Doxygen 规范的注释。
- 配置 Doxyfile:指定项目名称、输入文件路径等关键信息。
- 运行 Doxygen:执行
doxygen Doxyfile命令。 - 查看和更新:在浏览器中查看生成的 HTML 文档,并根据需要修改代码和注释。
养成使用 Doxygen 的习惯,会让你和你的团队成员更容易理解和维护代码。
