当前位置: 首页 > news >正文

Doxygen使用

文章目录

    • 简介
    • Doxygen的安装
    • Doxygen的配置
      • 生成配置文件
      • 常用配置
    • Doxygen注释
      • 头文件注释:
      • 函数的注释:
    • Doxygen文档生成
    • reference

简介

Doxygen 是一个流行的用于生产代码文档的工具,关于它的介绍可以参考官网:https://www.doxygen.nl/index.html。
我使用Doxygen的目的主要有三个:

  1. 生成在线文档,方便阅读
  2. 查看代码数据结构之间的关系
  3. 在其他项目中快速索引本项目的接口文档

Doxygen支持许多语言,我主要使用C/C++,生成的文档主要是HTML,生成后在浏览器中打开浏览。

Doxygen的安装

sudo apt install doxygen
sudo apt install graphviz

其中graphviz是一个强大的程序绘图工具,它的使用可以参考:Graphviz入门

Doxygen的配置

生成配置文件

进入项目目录:

doxygen -g

该命令会在当前路径生成一个名为Doxyfile配置文件.

Doxyfile 文件内容非常多,大概 1000 多行,不过其中大部分都是注释,每个配置选项都有一段详细的注释。如果对 Doxygen 各配置选项的意义有一定了解,可以在生成配置文件的命令中添加 “-s” 选项,生成不含注释的配置文件,操作如下:

doxygen -s -g

常用配置

执行完上面的生成命令, 已经有个模板Doxyfile,可以根据需要更改相应设置:

# 项目名称,将作为于所生成的程序文档首页标题
PROJECT_NAME           = "TEST"# 文档版本号,可对应于项目版本号,譬如 svn、cvs 所生成的项目版本号
PROJECT_NUMBER       = "1.0.0
# 程序文档输出目录
OUTPUT_DIRECTORY    =  doc-reference
# 程序文档语言环境
OUTPUT_LANGUAGE    = Chinese
# 如果是制作 C 程序文档,该选项必须设为 YES,否则默认生成 C++ 文档格式
OPTIMIZE_OUTPUT_FOR_C  = YES
# 对于使用 typedef 定义的结构体、枚举、联合等数据类型,只按照 typedef 定义的类型名进行文档化
TYPEDEF_HIDES_STRUCT   = YES
# 在 C++ 程序文档中,该值可以设置为 NO,而在 C 程序文档中,由于 C 语言没有所谓的域/名字空间这样的概念,所以此处设置为 YES
HIDE_SCOPE_NAMES        = YES
# 让 doxygen 静悄悄地为你生成文档,只有出现警告或错误时,才在终端输出提示信息
QUIET   = YES
# 只对头文件中的文档化信息生成程序文档
FILE_PATTERNS          = *.h
# 递归遍历当前目录的子目录,寻找被文档化的程序源文件
RECURSIVE              = YES
# 示例程序目录
EXAMPLE_PATH           = example/
# 示例程序的头文档 (.h 文件) 与实现文档 (.c 文件) 都作为程序文档化对象
EXAMPLE_PATTERNS       = *.c *.h
# 递归遍历示例程序目录的子目录,寻找被文档化的程序源文件
EXAMPLE_RECURSIVE      = YES
# 允许程序文档中显示本文档化的函数相互调用关系
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION    = YES
REFERENCES_LINK_SOURCE = YES
# 生成 latex 格式的程序文档
GENERATE_LATEX         = YES
# 在程序文档中允许以图例形式显示函数调用关系,前提是你已经安装了 graphviz 软件包
HAVE_DOT               = YES
CALL_GRAPH             = YES
CALLER_GRAPH           = YES
#让doxygen从配置文件所在的文件夹开始,递归地搜索所有的子目录及源文件
RECURSIVE = YES  
#在最后生成的文档中,把所有的源代码包含在其中
SOURCE_BROWSER = YES
$这会在HTML文档中,添加一个侧边栏,并以树状结构显示包、类、接口等的关系
GENERATE_TREEVIEW = ALL

模板:

# 项目名称,将作为于所生成的程序文档首页标题
PROJECT_NAME           = “Test
# 文档版本号,可对应于项目版本号,譬如 svn、cvs 所生成的项目版本号
PROJECT_NUMBER       = "1.0.0
# 程序文档输出目录
OUTPUT_DIRECTORY    =  doc/
# 程序文档语言环境
OUTPUT_LANGUAGE    = Chinese
# 如果是制作 C 程序文档,该选项必须设为 YES,否则默认生成 C++ 文档格式
OPTIMIZE_OUTPUT_FOR_C  = YES
# 对于使用 typedef 定义的结构体、枚举、联合等数据类型,只按照 typedef 定义的类型名进行文档化
TYPEDEF_HIDES_STRUCT   = YES
# 在 C++ 程序文档中,该值可以设置为 NO,而在 C 程序文档中,由于 C 语言没有所谓的域/名字空间这样的概念,所以此处设置为 YES
HIDE_SCOPE_NAMES        = YES
# 让 doxygen 静悄悄地为你生成文档,只有出现警告或错误时,才在终端输出提示信息
QUIET   = YES
# 只对头文件中的文档化信息生成程序文档
FILE_PATTERNS          = *.h
# 递归遍历当前目录的子目录,寻找被文档化的程序源文件
RECURSIVE              = YES
# 示例程序目录
EXAMPLE_PATH           = example/
# 示例程序的头文档 (.h 文件) 与实现文档 (.c 文件) 都作为程序文档化对象
EXAMPLE_PATTERNS       = *.c \*.h
# 递归遍历示例程序目录的子目录,寻找被文档化的程序源文件
EXAMPLE_RECURSIVE      = YES
# 允许程序文档中显示本文档化的函数相互调用关系
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION    = YES
REFERENCES_LINK_SOURCE = YES
# 不生成 latex 格式的程序文档
GENERATE_LATEX         = NO
# 在程序文档中允许以图例形式显示函数调用关系,前提是你已经安装了 graphviz 软件包
HAVE_DOT               = YES
CALL_GRAPH            = YES
CALLER_GRAPH        = YES
#让doxygen从配置文件所在的文件夹开始,递归地搜索所有的子目录及源文件
RECURSIVE = YES  
#在最后生成的文档中,把所有的源代码包含在其中
SOURCE BROWSER = YES
$这会在HTML文档中,添加一个侧边栏,并以树状结构显示包、类、接口等的关系
GENERATE TREEVIEW = ALL

Doxygen注释

Doxygen就是从源代码文件的注释中提取文档. 所以生成文档之前, 就是要按照Doxygen的风格来编写注释。

头文件注释:

/** @brief   这里写你的摘要*  @file    你的文件名*  @author  作者*  @version 版本*  @date    日期*  @note    注解. 例如: 本文件有什么具体功能啊, 使用时要注意什么啊..*  @since   自从...*/

函数的注释:

/**  这里写这个函数的概述@param[in]  输入参数1@param[in]  输入参数2@param[out] 输出参数1@return     返回值解释一下@warning    警告: 例如: 参数不能为空之类的@note       注解@see        类似于请参考xxoo函数之类的
*/

更多注释规则请查阅:

我主要使用vscode,可以安装doxygen插件,结合配置可以自动触发注释,我的配置如下:

	// Doxygen documentation generator set// 文件注释:版权信息模板"doxdocgen.file.copyrightTag": ["@copyright Copyright (c) {year}  company/organization"],// 文件注释:自定义模块,这里我添加一个修改日志"doxdocgen.file.customTag": ["@par 修改日志:","<table>","<tr><th>Date       <th>Version <th>Author  <th>Description","<tr><td>{date} <td>1.0     <td>czw     <td>内容","</table>",],// 文件注释的组成及其排序"doxdocgen.file.fileOrder": ["file",		// @file"brief",	// @brief 简介"author",	// 作者"version",	// 版本"date",		// 日期"empty",	// 空行"copyright",// 版权"empty","custom"	// 自定义],// 下面时设置上面标签tag的具体信息"doxdocgen.file.fileTemplate": "@file {name}","doxdocgen.file.versionTag": "@version 1.0","doxdocgen.generic.authorEmail": "name@address","doxdocgen.generic.authorName": "name","doxdocgen.generic.authorTag": "@author {author} ({email})",// 日期格式与模板"doxdocgen.generic.dateFormat": "YYYY-MM-DD","doxdocgen.generic.dateTemplate": "@date {date}",// 根据自动生成的注释模板(目前主要体现在函数注释上)"doxdocgen.generic.order": ["brief","details","tparam","param","return"],"doxdocgen.generic.briefTemplate": "@brief {text}","doxdocgen.generic.paramTemplate": "@param{indent:8}{param}","doxdocgen.generic.returnTemplate": "@return {type} ","doxdocgen.generic.splitCasingSmartText": true,

Doxygen文档生成

在上面生成的Doxyfile所在的路径, 输入

doxygen doxygen_config

doxygen_config 是 Doxygen 配置文件名,如果按照本文配置, 在doc-reference目录下, 会有html, latex文件夹. 使用浏览器打开html目录中的 index.html 文件,即可看到代码注释文档。

reference

  • https://www.doxygen.nl/index.html
  • https://pages.cs.wisc.edu/~jignesh/cs564/notes/Doxygen.pdf
  • https://www.doxygen.nl/manual/index.html

相关文章:

Doxygen使用

文章目录简介Doxygen的安装Doxygen的配置生成配置文件常用配置Doxygen注释头文件注释:函数的注释:Doxygen文档生成reference简介 Doxygen 是一个流行的用于生产代码文档的工具&#xff0c;关于它的介绍可以参考官网&#xff1a;https://www.doxygen.nl/index.html。 我使用Dox…...

MySQL数据库调优————表结构设计优化

三范式 第一范式 字段具有原子性&#xff0c;即数据库表的每一个字段都是不可分割的原子数据项&#xff0c;不能是集合、数组、记录等非原子数据项当实体中的每个属性有多个值时&#xff0c;必须拆分为不同的属性 第二范式 满足第一范式的基础上&#xff0c;要求每一行数据…...

set对象和map对象

1 Set对象 介绍: Set数据结构类似数组&#xff0c;但所有成员的值唯一。 Set本身为一个构造函数&#xff0c;用来生成 Set数据结构&#xff0c;使用 add方法来添加新成员。 let a new Set(); [1,2,2,1,3,4,5,4,5].forEach(x>a.add(x)); for(let k of a){ console.log(k…...

stream()流的使用

文章目录引入流流的操作中间操作终端操作流的使用谓词筛选筛选各异的元素流的切片截断流跳过元素映射流的扁平化查找和匹配归约元素求和、最大值和最小值数值流构建流由值构建流由数组创建流引入流 java api提供的一种利用声明式的方式处理数据集合的一个东西&#xff0c;可以…...

C++学习笔记-常量

在程序执行过程中&#xff0c;其值不能改变的量称为常量(Constant)。普通常量的类型是根据数据的书写形式来决定的。如 100 是整型常量&#xff0c;0.5 是实型常量&#xff0c;‘q’ 是字符型常量&#xff0c;“qianfeng” 是字符串常量。 常量是固定值&#xff0c;在程序执行期…...

JavaScript系列之实现继承的几种方式

文章の目录一、借助父构造函数继承属性1、实现方式2、优点3、缺点二、原型链继承1、实现方式2、优点3、缺点三、组合继承四、ES6继承的实现方式参考写在最后一、借助父构造函数继承属性 1、实现方式 先定义一个父构造函数(this指向为window)&#xff1b;再定义一个子构造函数…...

java面试准备

1.自我介绍: 2.基础 : 1.集合 : java容器中分为collection 和map两大类 collection 分为list集合(有序且重复的),set集合(无序,不可重复) list集合分为arrayList集合 : 查询快,增删慢,它是基于数组结构的,对数据的增删是在数组的尾部进行添加或删除的,其效率相对于LinkedList…...

kafka-6-python单线程操作kafka

使用Python操作Kafka&#xff1a;KafkaProducer、KafkaConsumer Python kafka-python API的帮助文档 1 kafka tools连接 (1)/usr/local/kafka_2.13-3.4.0/config/server.properties listeners PLAINTEXT://myubuntu:9092 advertised.listenersPLAINTEXT://192.168.1.8:2909…...

【Spring教程】1.Spring概述

1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发。从简单性、可测…...

设计模式-代理模式

控制和管理访问 玩过扮白脸&#xff0c;扮黑脸的游戏吗&#xff1f;你是一个白脸&#xff0c;提供很好且很友善的服务&#xff0c;但是你不希望每个人都叫你做事&#xff0c;所以找了黑脸控制对你的访问。这就是代理要做的&#xff1a;控制和管理对象。 监视器编码 需求&…...

DPDK — MALLOC(librte_malloc,Memory Manager,内存管理组件)

目录 文章目录 目录MALLOC(librte_malloc,Memory Manager,内存管理组件)rte_malloc() 接口malloc_heap 结构体malloc_elem 结构体内存初始化流程内存申请流程内存释放流程MALLOC(librte_malloc,Memory Manager,内存管理组件) MALLOC 库基于 hugetlbfs 内核文件系统来实…...

【Java开发】Spring 12 :Spring IOC控制反转和依赖注入(解决单接口多实现类调用)

IOC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;Spring 通过 IOC 容器来管理所有 Java 对象的实例化和初始化&#xff0c;控制对象与对象之间的依赖关系。我们将由 IOC 容器管理的 Java 对象称为 Spring Bean&#xff0c;它与使用关键字 new 创建…...

【C++学习】基础语法(三)

众所周知C语言是面向过程的编程语言&#xff0c;关注的是过程&#xff1b;解决问题前&#xff0c;需要分析求解的步骤&#xff0c;然后编辑函数逐步解决问题。C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事拆分成不同的对象&#xff0c;不同对象间交互解决问…...

k8s自动化安装脚本(kubeadm-1.23.7)

文章目录介绍软件架构版本介绍更新内容2023-02-192023-02-152023-02-142023-02-102022-10-202022-08-06准备部署包操作步骤环境准备结构备注解压部署包修改host文件脚本使用方式初始化环境验证ansible配置安装k8s集群登录master的节点添加node节点master节点状态检查组件安装安…...

面试题记录

Set与Map的区别 map是键值对&#xff0c;set是值的集合。键&#xff0c;值可以是任何类型map可以通过get获取&#xff0c;map不能。都能通过迭代器进行for…of遍历set的值是唯一的&#xff0c;可以做数组去重&#xff0c;map&#xff0c;没有格式限制&#xff0c;可以存储数据…...

链式前向星介绍以及原理

1 链式前向星 1.1 简介 链式前向星可用于存储图&#xff0c;本质上是一个静态链表。 一般来说&#xff0c;存储图常见的两种方式为&#xff1a; 邻接矩阵邻接表 邻接表的实现一般使用数组实现&#xff0c;而链式前向星就是使用链表实现的邻接表。 1.2 出处 出处可参考此…...

jenkins 安装 -适用于在线安装 后续写个离线安装的

jenkins安装1.下载jenkins2.安装启动3.附件卸载jdk的命令4.配置jenkins一、在jenkins配置文件中配置jdk环境变量二、修改jenkins默认的操作用户1.下载jenkins jenkins官网下载 https://www.jenkins.io/ 点击下载 我是centos系统所以选择centos&#xff0c;点击后按着官方提供…...

【C++】再谈vscode界面调试C++程序(linux) - 知识点目录

再谈vscode界面调试C程序&#xff08;linux&#xff09; 配套文档&#xff1a;vscode界面调试C程序&#xff08;linux&#xff09; 命令解释 g -g ../main.cpp 编译main.cpp文件&#xff1b; -g&#xff1a;生成调试信息。编译器会在可执行文件中嵌入符号表和源代码文件名&…...

蚂蚁感冒---第五届蓝桥杯真题

目录 题目链接 题目描述 分析&#xff1a; 代码&#xff1a; y总综合​ 666 题目链接 1211. 蚂蚁感冒 - AcWing题库 题目描述 分析&#xff1a; y总真牛逼&#xff0c;掉头等价于穿过&#xff0c;以第一个点为分界点&#xff0c;分别判断 代码&#xff1a; &#xff08;自…...

常见排序算法--Java实现

常见排序算法--Java实现插入排序直接插入排序折半插入排序希尔排序交换排序冒泡排序快速排序选择排序直接选择排序堆排序归并排序基数排序各种排序方法比较在网上找了些排序算法的资料。此篇笔记本人总结比较&#xff0c;简单注释&#xff0c;觉得比较好理解&#xff0c;且相对…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...