Doxygen 是一个非常强大的文档生成工具,它能够从你的源代码注释中自动生成格式化的文档(如 HTML、PDF、CHM 等),这对于大型项目、团队协作以及代码的可维护性至关重要。

为什么要在 C 语言中使用 Doxygen?
在 Doxygen 出现之前,开发者常常需要手动编写 Word 或 HTML 文档,这会导致文档和代码脱节,维护起来非常痛苦。
Doxygen 的核心优势在于:
- 代码与文档同步:文档直接写在代码里,修改代码时顺手就能更新文档,保证了文档的时效性。
- 自动化生成:只需一个命令,Doxygen 就能扫描整个项目,生成完整的文档网站或 PDF。
- 丰富的输出格式:支持 HTML、LaTeX (用于生成 PDF)、RTF、XML、CHM 等多种格式。
- 强大的链接功能:文档中可以自动链接到函数、变量、文件的定义处,甚至可以生成调用关系图、继承图等。
- 支持多种注释风格:除了 Doxygen 自身的风格,它还能理解 C++ 的 、JavaDoc 的 等风格,方便项目迁移。
Doxygen 注释风格
Doxygen 识别特定的注释标记(称为“块注释”),这些标记以 或 \ 开头,最常见的风格是 C 风格的 。
1 基本注释块
/** * @brief 这是一个简短的函数描述。 * * 这是一个详细的多行描述。 * 你可以在这里解释函数的用途、算法、注意事项等。 * @param a 第一个参数的描述。 * @param b 第二个参数的描述。 * @return 返回值的描述。 */ int my_function(int a, int b);
2 常用 Doxygen 标记
| 标记 | 描述 | 示例 |
|---|---|---|
@brief |
简短描述,通常放在第一行,用于生成函数/模块的摘要。 | @brief This function adds two numbers. |
@param <name> <description> |
参数描述。<name> 是参数名,<description> 是其说明。 |
@param a The first integer. |
@return <description> |
返回值描述,说明函数返回值的含义。 | @return The sum of a and b. |
@note |
注意事项,添加一个需要注意的提醒。 | @note This function may overflow if the result is too large. |
@warning |
警告,添加一个重要的警告信息。 | @warning Do not pass a NULL pointer for a. |
@todo |
待办事项,标记需要完成的任务。 | @todo Add bounds checking for the input. |
@see <item> |
相关参考,链接到其他相关的函数、结构体或文件。 | @see my_other_function() |
@author <name> |
作者,指定代码或文档的作者。 | @author John Doe <john.doe@example.com> |
@version <x.y.z> |
版本号,指定代码的版本。 | @version 1.2.3 |
@file <filename> |
文件注释,用于对整个源文件进行说明,通常放在文件最开头。 | @file utils.h |
@defgroup <name> <title> |
定义一个组,将相关的函数、宏等组织成一个逻辑组。 | @defgroup MathUtils Math Utilities |
@ingroup <name> |
将元素加入组,将当前函数/结构体等添加到指定的组中。 | @ingroup MathUtils |
@struct <name> |
结构体/联合体文档,为结构体或联合体提供文档。 | @struct Point |
@var <name> |
成员变量描述,在结构体/联合体文档块内部,用于描述其成员。 | @var x The x-coordinate. |
实践:为一个 C 项目生成文档
假设我们有一个简单的 C 项目,包含一个头文件 calculator.h 和一个源文件 calculator.c。

项目结构
my_project/
├── calculator.h
├── calculator.c
└── Doxyfile (这是 Doxygen 的配置文件)
1 示例代码
calculator.h
#ifndef CALCULATOR_H
#define CALCULATOR_H
/**
* @file calculator.h
* @brief A simple calculator library.
* @author Your Name <you@example.com>
* @version 1.0
* @date 2025-10-27
*
* This header file declares the basic arithmetic functions.
*/
/**
* @defgroup ArithmeticFunctions Arithmetic Functions
* @brief Functions for basic arithmetic operations.
* @{
*/
/**
* @brief Adds two integers.
*
* This function takes two integers and returns their sum.
* @param a The first integer.
* @param b The second integer.
* @return The sum of a and b.
*/
int add(int a, int b);
/**
* @brief Subtracts the second integer from the first.
*
* @param a The first integer (minuend).
* @param b The second integer (subtrahend).
* @return The result of a - b.
*/
int subtract(int a, int b);
/** @} */
#endif // CALCULATOR_H
calculator.c
#include "calculator.h"
int add(int a, int b) {
/**
* @note This is a trivial implementation.
* For production, consider overflow checking.
*/
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
2 创建 Doxygen 配置文件 (Doxyfile)
Doxygen 的行为由一个名为 Doxyfile 的文本文件控制,你可以通过命令行生成一个默认的配置文件:
doxygen -g Doxyfile
你需要编辑这个 Doxyfile 文件,使其适应你的项目,以下是几个最关键的配置项:
# 项目名称,将显示在生成的文档首页 PROJECT_NAME = "My C Calculator Project" # 项目简介 PROJECT_BRIEF = "A simple demonstration of Doxygen with C" # 输出目录 OUTPUT_DIRECTORY = ./docs # 指定需要扫描的源文件或目录 INPUT = ./calculator.h ./calculator.c # 指定文件包含的路径,以便 Doxygen 能找到被包含的头文件 # 如果你的头文件在 include/ 目录下 # INCLUDE_PATH = ./include # 启用对 C 语言的解析 ENABLE_PREPROCESSING = YES # 是否生成调用图和依赖图 HAVE_DOT = NO # 如果你没有安装 Graphviz,设为 NO CALL_GRAPH = NO CALLER_GRAPH = NO # 设置语言,影响一些标签的翻译 OUTPUT_LANGUAGE = English # 是否在 HTML 输出中生成目录树 GENERATE_TREEVIEW = YES # 是否为每个源文件生成单独的文档页面 SOURCE_BROWSER = YES # 是否在文档中显示原始代码 INLINE_SOURCES = NO
重要提示:HAVE_DOT 选项需要 Graphviz 软件的支持,如果你想生成漂亮的调用关系图和类图(在 C 中是结构体关系图),必须安装 Graphviz 并将 HAVE_DOT 设为 YES。
3 生成文档
一切准备就绪,在项目根目录下(my_project/),运行以下命令:
doxygen Doxyfile
Doxygen 会开始扫描你的文件,并根据 Doxyfile 的配置生成文档,默认情况下,它会创建一个名为 docs 的目录,里面包含 html 和 latex 等子目录。
4 查看文档
打开 docs/html/index.html 文件,你就能在浏览器中看到美观、交互式的 HTML 文档了。
高级技巧
1 注释内部函数/变量
有时你不想让某个内部函数或变量出现在公共 API 文档中,可以使用 @internal 标记。
/**
* @brief An internal helper function.
* @internal
* This function is not part of the public API.
*/
void _internal_helper() {
// ...
}
2 描述宏
对于宏,你可以使用 @def 标记。
/** * @def MAX(a, b) * @brief A macro to find the maximum of two numbers. * * @param a The first number. * @param b The second number. * @return The larger of a and b. */ #define MAX(a, b) ((a) > (b) ? (a) : (b))
3 生成 PDF 文档
要生成 PDF,你需要:
- 确保
Doxyfile中的GENERATE_LATEX选项设为YES。 - 安装 LaTeX 环境(如 TeX Live 或 MiKTeX)。
- 在生成 HTML 文档后,运行以下命令:
make -C docs/latex
这会在 docs/latex/ 目录下生成一个 refman.pdf 文件。
| 步骤 | 命令/操作 | 描述 |
|---|---|---|
| 安装 Doxygen | sudo apt-get install doxygen (Linux) 或从官网下载安装 |
确保系统已安装 Doxygen。 |
| 编写带注释的代码 | 使用 和 Doxygen 标记 (@brief, @param 等) |
将文档作为代码的一部分。 |
| 生成配置文件 | doxygen -g Doxyfile |
创建一个默认的 Doxygen 配置文件。 |
| 编辑配置文件 | 修改 Doxyfile 中的 PROJECT_NAME, INPUT 等关键项 |
让 Doxygen 知道你的项目结构。 |
| 生成文档 | doxygen Doxyfile |
运行 Doxygen,扫描代码并生成文档。 |
| 查看结果 | 打开 docs/html/index.html |
在浏览器中享受你的成果! |
将 Doxygen 集成到你的 C 语言工作流中,是一项能极大提升项目专业性和可维护性的投资,从今天起,就给你的代码加上规范的 Doxygen 注释吧!
