C++代码注释详解

常用注释语法

  • 注释写在对应的函数或变量前面。JavaDoc类型的多行注释风格如下:
/**
* 这里为注释.
*/
  • 一般注释中有简要注释和详细注释,简要注释有多种标识方式,这里推荐使用@brief命令强制说明,例如:
    
/**
* @brief 这里为简要注释.
*
* 这里为详细注释.
*/
  • @brief之后为简要注释,简要注释结束的标志是一个点号,或一个空行。简要注释之后的注释为详细注释,因此也可以写成:其中\n为换行符。
/**
* @brief 简要注释. 详细注释. \n
* 这里仍然为详细注释.
*/
  • 下面对几种注释类型进行描述。

文件头注释

  • 一般@file后为空,Doxygen会默认为是@file所在文件的文件名。[]表示可选,{}表示重复0到N次,<>表示必须参数,@author表示作者,@data表示日期,@version表示版本号。
/** 
* @file [file-name]
* @brief brief description for the file.
* @author <list of authors>
* {@author <list of authors>}
* [@author <authors description>]
* @date <date>
* @version <version number>
*
* detailed description for the file.
*/

类注释

  • header-file是类声明所在的头文件名字,header-name是要显示的链接文字,一般为头文件的真实路径。
/**
* @class <class-name> [header-file] [header-name]
* @brief brief description for the class.
*
* detailed description for the class.
*/

函数注释

/**
* @brief brief description.
* {@param <parameter-name> <parameter description>}
* @exception <exception-object> <exception description>
* {@exception <exception-object> <exception description>}
* @return <description of the return value>
* {@return <description of the return value>}
* @note <text>
* @remarks <remark text>
* {@remarks <remark text>}
* [@deprecated <description>]
* [@since when(time or version)]
* [@see references{,references}]
*/
@param参数名及其解释(param后加[in]表示输入参数,param后加[out]表示输出参数)
@exception用来说明异常类及抛出条件
@return  对函数返回值做解释
@note  表示注解,暴露给源码阅读者的文档
@remark 表示评论,暴露给客户程序员的文档
@since表示从那个版本起开始有了这个函数
@deprecated引起不推荐使用的警告
@see 表示交叉参考

 成员注释

  • /**<用来注释成员,放在成员后面,格式如下:
int var; /**< Detailed description after the member */
  • 此语法对成员函数也适用。对于枚举类型也可采用这种注释,如下:
/** @brief Another enum, with inline docs */
enum AnotherEnum
{V1,   /**< value 1 */V2    /**< value 2 */
};

项目符号标记注释

 /**
* A list of events:
* - mouse events
* -# mouse move event
* -# mouse click event\n
*/
结果为:A list of events:。mouse eventsmouse move eventmouse click event

分组注释

  • 对于某几个功能类似的代码项(比如类、函数、变量)等,如果希望一起添加注释,而又不想提升到模块的概念,可以通过下面的方式:
/**
* @name 组名 组的说明文字
* @brief 组的简要注释.
* 
* 组的详细注释.
* @{
*/
  • 组内的代码;
  • 在一页内分组显示。其中组名组名的命名符合c++命名规范。
/** @} */ //组结尾

 模块注释

  • 进行设计时,通常有模块的概念,一个模块可能有多个类或者函数组成,完成某个特定功能的代码的集合。生成的模块的注释会单独放在一个模块的页面中。使用下面的格式定义一个模块:
/**
* @defgroup 模块名 模块的说明文字
* @brief模块的简要注释.
*
* 模块的详细注释.
* @{
*/

代码;

/** @} */ // 模块结尾
  • 其中模块名Module-Name的命名符合c++命名规范。
  • 任何其他代码项(比如类、函数、甚至文件)如果要加入到某个模块,使用ingroup命令即可。模块之间使用ingroup命令,可以组成树状关系。例如要把文件util.cpp加入到模块module_A中,格式如下:
/** 
* @file util.cpp 
* @ingroup module_A
* @brief brief description of the module.
*
* detailed description of the module.
* @
*/
  • 同样,对于类和命名空间都可以加入到某模块中,所不同的是把@file util.cpp换成对应的@class class-name和@namespace namespace-name。
  • 把多个代码项一起添加到某个模块中可以使用addtogroup命令,格式和defgroup类似,如下:
/**
* @addtogroup模块名
* @{
*/

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

段错误:SIGSEGV

SIGSEGV是在访问内存时发生的错误&#xff0c;它属于内存管理的范畴 SIGSEGV是一个用户态的概念&#xff0c;是操作系统在用户态程序错误访问内存时所做出的处理。 当用户态程序访问&#xff08;访问表示读、写或执行&#xff09;不允许访问的内存时&#xff0c;产生SIGSEGV。 …

web3 0.2.x 和 1.x.x版本之间的差异

版本差异 单位转换 0.2.x web3.fromWei(13144321,ether) 1.x.x web3.utils.fromWei(13144321,ether)1.0以后的版本使用了大量的Promise&#xff0c;可以结合async/await使用&#xff0c;而0.20版本只支持回调函数

如何提高阅读源码的能力并且手撕源码

怎么有效的手撕代码呢&#xff1f; 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo

并发和并行的区别简单介绍

并发和并行 并发是关于正确有效地控制对共享资源的访问 同时完成多个任务。在开始处理其他任务之前&#xff0c;当前任务不需要完成。并发解决了阻塞发生的问题。当任务无法进一步执行&#xff0c;直到外部环境发生变化时才会继续执行。最常见的例子是I/O&#xff0c;其中任务…

手撕源码 alloc

怎么有效的手撕代码呢&#xff1f; gnu gcc 2.9 的 内存池 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo 第三步&#xff1a; 第五步: // 这个头文件包含一个模板类 allocator&#xff0c;用于管理内存的分配、…

Algorand的共识协议及其核心的优势

Algorand 设计的初衷 Algorand 想解决的核心问题是&#xff1a;去中心化网络中低延时&#xff08;Latency&#xff09;和高置信度&#xff08;Confidence&#xff09;之间的矛盾。其中&#xff0c;延时指从发起交易到确认交易所需要的时间&#xff1b;置信度指的是发出的交易不…

手撕源码 SQL解析器 sqlparser

怎么有效的手撕代码呢&#xff1f; 源代码&#xff1a;https://github.com/hyrise/sql-parser 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo

针对Algorand所使用的密码相关技术细节进行介绍

关键概念 VRF: 可验证随机函数。简单来说是&#xff1a;vrf,Proof VRF(sk,seed)&#xff0c;sk为私钥&#xff0c;seed为随机种子&#xff1b;通过Verify(proof,pk,seed)验证vrf的合法性。cryptographic sorition: 根据用户本轮的VRF值&#xff0c;自身的权重以及公开的区块链…

内存池的实现1 :重载

#ifndef KSTD_ALLOCATOR_H_ #define KSTD_ALLOCATOR_H_// 这个头文件包含一个模板类 allocator&#xff0c;用于管理内存的分配、释放&#xff0c;对象的构造、析构 // 暂不支持标准库容器 todo::支持萃取#include <new> // placement new #include <cstddef>…

对于Algorand的介绍

介绍 Algorand具有能耗低、效率高、民主化、分叉概率极低、可拓展性好等优点&#xff0c;旨在解决现有区块链项目存在的“不可能三角”&#xff08;高度可扩展的、安全的、去中心化&#xff09;问题。Algorand由MIT教授、图灵奖得主Silvio Micali发起&#xff0c;拥有MIT区块链…

内存池的实现2 类专用的内存适配器

B类增加了嵌入指针 #include<new> #include<ctime> #include<iostream> #include<cstdio> class A { public:A() {printf("next%p\n", next);};static void* operator new(size_t size);static void operator delete(void* phead);static i…

C++学习 高级编程

C 文件和流 到目前为止&#xff0c;目前使用最为广泛的是 iostream 标准库&#xff0c;它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。以下将介绍从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream&#xff0c;它定义了三个新的数…

内存池的实现3 固定大小的allocator单线程内存配置器

如果我们想使内存管理器用于其他大小不同的类该怎么办呢&#xff1f;为每一个类重复管理逻辑显然是对开发时间的不必要浪费。如果我们看一下前面内存管理器的实现&#xff0c;就会明显地看出内存管理逻辑实际上独立于特定的类 有关的是对象的大小一这是内存池模板实现的良好候选…

C++中文版本primer 第二章变量和基本类型 学习笔记

2.2变量 2.2.1 变量定义 列表初始化 定义一个名字为units_sold的int变量并初始化为0 int units_sold 0; int units_sold {0}; int units_sold{0}; int units_sold(0); C11 用花括号来初始化变量&#xff0c;上面这个步骤也称之为列表初始化。这种初始化有一个重要的特点&…

内存池中的嵌入式指针

嵌入式指针 可以union改struct 内存分配后 next指针就没用了 直接作为数据空间比较省内存 因为对指针指向的内存存储的时候 编译器是不管你是什么类型的 &#xff0c;这里有道练习题可以对指针的概念稍微理解一下&#xff1a; #include <iostream> using std::cout; us…

C++ 标准程序库std::string 详解

现在一般不再使用传统的char*而选用C标准程序库中的string类&#xff0c;是因为string标准程序和char*比较起来&#xff0c;不必担心内存是否足够、字符串长度等等&#xff0c;而且作为一个类出现&#xff0c;集成的操作函数足以完成大多数情况下(甚至是100%)的需要。比如&…

内存池的实现4 alloc内存池

alloc 内存池 优点: &#xff1a;本质是定长内存池的改进&#xff0c;分配和释放的效率高。可以解决一定长度内存分配的问题。 缺点 &#xff1a;存在内碎片的问题&#xff0c;且将一块大内存切小以后&#xff0c;申请大内存无法使用&#xff0c;别的FreeList挂了很多空闲的内存…

C++primer第15章节详解面向对象程序设计

前言 面向程序设计基于三个基本概念&#xff1a;数据抽象、继承和动态绑定。继承和动态绑定可以使得程序定义与其他类相似但是不完全相同的类&#xff1b;使用彼此相似的类编写程序时候&#xff0c;可以在一定程度上忽略掉他们的区别。 OOP概述 oop&#xff08;面向程序的设…

内存池的线程安全问题

malloc/free 据说老版本libc 有俩个版本&#xff0c;当你连接 pthread库的时候它就链接的是线程安全版&#xff0c;否则不是。在glic 2.2 以上无论怎么都是线程安全的。 new/delete new/delete 封装的 malloc/free , 如果malloc/free 是它们就是线程安全的。

C++11命名空间的using说明

std::cin 表示从标准输入读取内容&#xff0c;此处的作用域操作符::是指编译器应该从左侧名字所示的作用域中寻找右侧那个名字。因此std::sin表示使用命名空间std中的cin。 每个名字都需要有独立的using的声明 每一个using声明引入命名空间中的一个成员&#xff0c;比如可以将…