doxygen教程-6-把注释放在其他位置

2023-11-01

把注释放到成员之后

这里出现了新词"成员(member)", 在官方手册里也是直接就用了这个词, 而没有给出定义. 我们已经知道, 结构体, 枚举等类型内部声明的变量被称为 member, 而根据官方手册给出的例子来看, 全局变量也被当作 member. 把全局变量看成是文件的 member, 也说得通.

在前面的介绍中, 我们都是把注释放在函数之前的, 而对于结构体, 联合, 枚举这些复合类型, 把注释放到它们的成员的后面或许会更方便.

对于变量, 我们通常也喜欢把注释放到定义的后边. 要做到这一点, 语法很简单, 只要在前面注释的基础上, 多加一个小于号 < 就成了, 例如:

int var1; /*!< Detailed description after the member in Qt style */
int var2; /**< Detailed description after the member in Javadoc style */
int var3; //!< Detailed description after the member
          //!<

同样, 如果希望注释内容被当作 brief, 换成只有一行的单行注释即可:

int var; //!< Brief description after the member
int var; ///< Brief description after the member

举个例子, 下面定义了两个全局变量, 其中一个注释在定义前, 而另一个注释在定义后:

/// Brief before global variable
int var1;

int var2;  ///< Brief after a global variable;

输出如下:

在这里插入图片描述

这种方法也可以用来注释函数的参数, 例如:

/** A func to test inline documentation. */
void many_params(
    int a,  ///< [in] pass in a
    int b,  ///< [in] pass in b
    int *c  ///< [out] pass out c    
);

其中 [in], [out] 表示函数参数的数值传递的方向, 用法与 @param 命令相同. 这个注释输出成网页是这个样子的:

在这里插入图片描述

上述注释除了多了 < 符号之外, 和前文介绍的 special comment block 的含义和结构是一样的. 但是有一个限制, 就是只能用于注释成员(members)参数(parameters), files, classes, unions 等类型自身不能使用这种注释.

注释在头文件和源文件的分布

通常将 C 语言的代码组织成头文件和源文件两部分,头文件中放各种声明,源文件放定义。我们希望可以通过头文件快速浏览有哪些可用的接口,而对于源文件的函数定义,我们则希望可以看到详细的说明。因此,为了保持头文件紧凑,我们可以只在头文件里写 brief,提供必要的简介,而在源文件里写 detail,从而开发者可以在研究函数实现的同时,方便地看到详细的介绍。

Structural commands

把注释放到(几乎)任意位置

目前为止, 我们已经知道如何把注释块放到被注释的 entity 的前边或后边, 而 doxygen 实际上支持把注释块放到几乎任何地方(除了函数体内或普通的C注释内).

在 Special commands 中, 有一类命令称为 Structural Commands, 利用这类指令, 我们可以在一处写代码, 而把注释放到很远的其他地方, 甚至可以是另一个文件. 例如

/** @fn fun()
    A function at another file.
*/

这里, @fn 命令指出这个注释的内容是函数 fun() 的文档. 其他的 structural commands 如下:

命令 使用对象
@struct 结构体
@union 联合
@enum 枚举
@fn 函数
@var 变量, typedef 或 enum 的值
@def #define
@typedef 类型定义
@namespace 命名空间
@package Java package
@interface IDL interface

下面是官方手册上, 一个具体的例子(简洁起见, 做了些删改):

/*! @file structcmd.h
    @brief A Documented file.
    Details.
*/
/*! @def MAX(a,b)
    @brief A macro that returns the maximum of \a a and \a b.
    Details.
*/
/*! @var typedef unsigned int UINT32
    @brief A type definition for a .
	Details.
*/
/*! @var int errno
    @brief Contains the last error code.
    @warning Not thread safe!
*/
/*! @fn int open(const char *pathname,int flags)
    @brief Opens a file descriptor.
    @param pathname The name of the descriptor.
    @param flags Opening flags.
*/
/*! @fn int close(int fd)
    @brief Closes the file descriptor \a fd.
    @param fd The descriptor to close.
*/

#define MAX(a,b) (((a)>(b))?(a):(b))
typedef unsigned int UINT32;
int errno;
int open(const char *,int);
int close(int);

也可以把本例的注释放到别的文件中. 如果文件扩展名是 .dox, .txt, .doc, .md, 默认这些文件会被 doxygen 读取, 但不会显示在文件列表中, 所以可以考虑把本例中的注释放到 .dox 或 .txt 文件中, 以保持输出文档的整洁.

值得注意的是, 采用 structural commands 注释, 要多写一次变量定义, 函数原型等, 所以后续修改代码时, 要同时修改两处(代码和注释). 而且, 把注释放在远离被注释的 entity 的地方, 不太方便查看. 因此, 除非有什么特殊的理由迫使你这样做, 否则采用 structural commands 通常不是个好主意.

只有先注释高层级的结构, 才会显示低层级的注释

前面也已经提到过, 在默认配置下要在输出的文档中显示注释的内容, 代码中至少要有一句 /** @file */. 这里把官方手册的原文摘录如下:

To document a member of a C++ class, you must also document the class itself. The same holds for namespaces. To document a global C function, typedef, enum or preprocessor definition you must first document the file that contains it (usually this will be a header file, because that file contains the information that is exported to other source files).

大意是, 要注释一个 C++ 类的成员, 必须先注释这个类它本身. 要注释一个全局的 C 函数, typedef, enum 或 #define, 也必须先注释这个文件.

在注释全局对象(函数, typedef, enum等), 必须先注释这些对象所在的文件这一点常常被忽略, 所以再次提醒.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

doxygen教程-6-把注释放在其他位置 的相关文章

  • 在 doxygen 布局中添加新用户选项卡

    我是使用 doxygen 1 8 7 的新手 我正在尝试将架构图添加为使用 doxygen 为我的 C 项目生成的 API 文档的一部分 我生成了默认的 doxygen 布局文件 DoxygenLayout xml 并通过添加以下更改来编辑
  • 我应该如何使用 Doxygen 对 typedef 进行分类?

    我的 C 代码中有 typedef 结构 截至目前 它们被列为 var类型定义 有一个更好的方法吗 下面是我所拥有的示例 var typedef etc brief A type defined structure for etc para
  • 混合 java/scala 项目自动生成的文档

    我希望获得一些有关如何最好地为混合 Java Scala 项目自动生成文档的建议 我们使用的是 Scala 2 8 2 8 1 附带的 scaladoc 工具似乎没有为我们的 Java 类生成可用的文档 它获得了正确的结构 但不包含文档 而
  • X 宏破坏 doxygen 调用图

    我有3个文件 test c int table define X val val include test x undef X void level2 void level3 level4 void level3 void level4 t
  • 从 Shell 输出生成文档

    有没有一种方法 工具可以直接从我的 Shell 输出甚至保存的日志生成 HTML 文档 类似于 doxygen 的作用 如果没有可用的东西 你们对如何使用现有工具做到这一点有什么创意吗 我想 在打字时 我可以放置某种标记或特殊字符 然后让一
  • 我可以在函数头中包含 cppcheck 抑制吗?

    我添加了一个内联注释来抑制函数的 cppcheckusedFunction 警告 但我想将其包含在函数头中 以便 Doxygen 可以记录所有未使用的函数 我正在实现一个 API 所以我有很多函数不会在我的源代码中使用 我不想抑制所有未使用
  • c 中的 doxygen:定义分组

    我正在使用 doxygen 记录 C 代码 为了使文档更具可读性 我希望至少使用 defgroup 和 ingroup 将每个 c h 文件对中的代码添加到一组 在这些组中 我想使用 name 块将一些定义分组 在一起 文件 页面中的结果看
  • python 中的 Doxygen C++ 注释字符串解析器?

    有人知道有一个 python 模块可以解析 doxygen 风格的 C 注释字符串吗 我的意思是像这样的字符串 简单的例子 A constructor A more elaborate description of the construc
  • 如何生成 rdoc 风格的可折叠代码段?

    我正在使用 Doxygen 为 C 项目创建内部文档 我让 Doxygen 包含方法的源代码等 但这使得页面难以扫描 我希望它的行为像 rdoc 一样 并将源代码隐藏在默认折叠的块中 我以为HTML DYNAMIC SECTIONS可能会让
  • 如何避免 c++ 和 boost::python 文档之间的冗余?

    我使用 boost python 在 C 代码中添加 python 模块 C 项目使用 doxygen 进行记录 我想为 python 模块创建一个文档 但我不知道如何不像这样冗余 include
  • Doxygen copydoc 标签可重用代码示例

    我想使用 copydoc 标签重用示例代码块 来解释一下问题 假设我有两个已记录的函数 Aquires resource Resource AquireResource int id Releases resource void Relea
  • C 和 doxygen - 删除变量文档的重复项

    我正在使用 doxygen 记录我的 C 代码 为了更好的可读性 我将每个 c h 文件对 有时还有更多文件 的文档分组为defgroup and addtogroup see c 中的 doxygen 定义分组 https stackov
  • 如何创建指向同一文件的 Doxygen 链接

    我想编写一条 Doxygen 注释来命名出现注释的文件 我希望 Doxygen 为我提供文件名 而不是显式地编写文件名 因此 如果我更改文件的名称 或将某些内容移动到不同的文件中 我不需要更改名称的硬编码实例 举一个具体的例子 假设我要向
  • 使用 Doxygen 记录命名空间

    我在 Doxygen 识别命名空间和模块时遇到问题 我认为问题在于是否将 addtogroup命名空间内或命名空间外 示例 1 在命名空间之外 addtogroup Records Generic record interfaces and
  • 如何显示定义的值

    在一些 doxygen 文档中 我想显示 define 而不是标签本身 例如 在一个 C 文件中我有 define REPEAT N TIMES 10 现在我想在我的文档中显示 该动作进行10次 如果我使用 ref REPEAT N TIM
  • Doxygen 注释的“使用命名空间”

    我的库的所有类都是在命名空间内定义的 当我为 Doxygen 创建主页时 我必须在注释中显式使用此命名空间以使 Doxygen 生成链接 我想对整个评论块使用类似 使用命名空间 的内容 一个例子 mainpage My Library Us
  • 在 doxygen 中使用 SVG

    我正在尝试将 SVG 添加到我的 doxygen 文档中 第一次尝试是使用 image blabla svg 这有点工作 但是 SVG 包含另一个 png 参考 并且 内部 png 未显示 这在 Chrome 上有效 但即使在 Firefo
  • Doxygen:显示未记录方法的警告

    我已经用 doxygen 激活了警告 WARNINGS YES WARN IF UNDOCUMENTED YES WARN IF DOC ERROR YES WARN NO PARAMDOC YES 但未记录的方法如下 void Anima
  • Mathworks 生成 Matlab HTML 文档的方法是什么?

    我正在开发共享的 Matlab 代码 我们希望在本地网络中将生成的文档作为可搜索的 HTML 文档共享 我知道以下生成文档的方法 编写一个类似于 C 文件的转换器 这是在中完成的将 Doxygen 与 Matlab 结合使用 http ww
  • GitHub Pages (github.io) doxygen 生成的页面未找到 (404)

    我不明白为什么找不到 doxygen 生成的页面 404 它在Github存储库中的路径是https github com AubinMahe AubinMahe github io blob master doxygen html dd

随机推荐

  • uniapp实现支付功能 和 可视化拖拽工具

    1 支付功能 https blog csdn net weixin 37787674 article details 103012041 2 分享一个 uniapp uview ui 可视化 完全自由拖拽 一键生成flex代码网站 http
  • 你必须知道的495个C语言问题整理三

    1 为什么大家都说不要使用gets 跟fgets 不同 gets 不能被告知输入缓冲区的大小 因此不能避免缓冲区的溢出 标准库的fgets 函数对gets 作了很大的改进 尽管它仍然不完善 2 fgetops fsetops 和ftell
  • python入门笔记——函数①

    python入门笔记 函数 def function 定义一个名为function的函数 定义函数时用下面来解释该函数的用处 这个函数是用来重复输出4次 你好 的 return for i in range 1 5 print 你好 pas
  • SSL、TLS、HTTPS的关系

    SSL TLS HTTPS的关系 SSL Secure Sockets Layer 安全套接字协议 TLS Transport Layer Security 传输层安全性协议 TLS是SSL的升级版 两者几乎是一样的 HTTPS Hyper
  • Java 多线程 -- 从入门到精通

    持续更新中 欢迎收藏 关注 以便查看后续 Java 多线程 从入门到精通 Java线程与线程的区别 多线程的实现方法 Thread中start和run方法的区别 Thread和Runnable的关系 使用Callable和Future创建线
  • 神经网络的三种可视化方法——使用keras和MXNet(gluon)实现

    神经网络的三种可视化方法 用keras和MXNet gluon 实现 目录 神经网络的三种可视化方法 用keras和MXNet gluon 实现 概述 keras实现 keras特征图可视化 keras可视化滤波器 卷积核 的最大响应图 k
  • 清除内存/缓存

    1 查看缓存 free h 2 清理缓存 sync echo 3 gt proc sys vm drop caches 我们在清理缓存前应该先sync下 因为系统在操作的过程当中 会把你的操作到的文件资料先保存到buffer中去 因为怕你在
  • 刷脸支付产业也迎来新的跃升时刻

    2019年刷脸支付异常火爆 一种创投人青睐有加 纷纷入局 一项新事物从诞生到发展总要经历很多波折 对于刷脸支付行业来说 更是如此 2020年初新冠疫情肆虐 人们被围在城里 圈在村里 各类实体门店到店率急剧下降 刷脸支付一度遇冷 而在疫情期间
  • C++星罗万象时钟罗盘

    编写思路 该程序的难点在于字符串的书写角度 理解了这个就已经理解了这个程序的核心内容 需要注意的地方是这个程序的每一圈代表一个 for 循环 我开始写的时候认为一个 for 循环嵌套一个 for 循环 但是后面我发现 for 循环嵌套的太多
  • vue-chat项目之重构与体验优化

    前言 vue chat 也就是我的几个月之前写的一个基于vue的实时聊天项目 到目前为止已经快满400star了 注册量也已经超过了1700 消息量达2000 由于一直在实习 没有时间对它频繁地更新 趁着这个国庆 对他进行了一次重构 希望我
  • 国内研发!适用于安卓应用程序的 Word文档功能开发组件来啦!

    你是否在寻找一款工具能够在Android应用程序中的Word文档管理的开发工具 那么 好消息来啦 Spire系列文档开发组件又添新成员 专门用于在 Android 手机应用程序中创建 读取 操作和转换 Word 文档 Spire Doc f
  • Flutter移动应用开发 - 商品界面

    目录 0 项目简介 1 效果展示 2 代码 commodity dart CardTry dart recentPurchase dart 0 项目简介 项目想法脱胎于2023年服务外包大赛A18题 随手买 详情 整个APP思路如下 这篇博
  • QDockWidget设置初始大小的一个解决方案

    QDockWidget仅仅作为其子控件的一个包装 因此对其使用resize 或者setGeometry 均不管用 这造成QDockWidget的初始大小常常不尽如人意 网上有前辈提出通过调用QDockWidget的setMaximumSiz
  • ElementUI浅尝辄止34:Radio 单选框

    在一组备选项中进行单选 1 如何使用 由于选项默认可见 不宜过多 若选项过多 建议使用 Select 选择器 要使用 Radio 组件 只需要设置v model绑定变量 选中意味着变量的值为相应 Radio label属性的值 label可
  • 工业设备自动化平台的一些杂想

    今天是愚人节 浦西开始正式封闭 所有人都被关在家里足不出户 等待着不知道何时开始的核酸检测 一时间也不知道能做些啥 闲的发慌 总得找点事情做做 翻了会CLR的书 又背了会单词 总感觉心不静 回想起之前被人问过的工业设备自动化平台的问题 突然
  • 非递归实现二叉树遍历(附c++完整代码)

    先序 中序和后序遍历过程 遍历过程中经过结点的路线一样 只是访问各结点的时机不同 从图中可以看到 前序遍历在第一次遇见元素时输出 中序遍历在第二次遇见元素时输出 后序遍历在第三次遇见元素时输出 非递归算法实现的基本思路 使用堆栈 一 前序遍
  • 【Android Studio】android.database.sqlite.SQLiteException: no such table: XXX (code 1 SQLITE_ERROR)

    问题描述 android database sqlite SQLiteException no such table XXX code 1 SQLITE ERROR while compling select from xxxx 参考了各种
  • 字符替换C++

    题目描述 把一个字符串中特定的字符全部用给定的字符替换 得到一个新的字符串 输入 只有一行 由一个字符串和两个字符组成 中间用单个空格隔开 字符串是待替换的字符串 字符串长度小于等于1000个字符 且不含空格等空白符 接下来一个字符为需要被
  • FileReader读取文件

    前言 FileReader是一种异步文件读取机制 结合input file可以很方便的读取本地文件 input file 在介绍FileReader之前 先简单介绍input的file类型
  • doxygen教程-6-把注释放在其他位置

    文章目录 把注释放到成员之后 注释在头文件和源文件的分布 Structural commands 把注释放到 几乎 任意位置 只有先注释高层级的结构 才会显示低层级的注释 把注释放到成员之后 这里出现了新词 成员 member 在官方手册里