转:基于 Doxygen 的 C++ 注释风格

以下来自:guqian110.github.io


Title: 基于 Doxygen 的 C++ 注释风格
Date: 2015-01-13 18:00
Category: Linux
Tags: C++, comment style
Slug: doxygen_cpp_comment_style
Author: Qian Gu
Summary: 总结基于 Doxygen 的 C++ 注释规则

本文内容参考自网上博客内容

C++标准注释原则 - 基于doxygen的C++注释

Doxygen C++注释规范及生成帮助文档配置步骤

Doxygen详细介绍(三)(Doxygen注释风格)

重新整理排版了一下。写本文的主要目的是备忘,当作快速参考来查。


Doxygen


若想用 Doxygen 生成漂亮的文档,我们必须在以下几个地方添加 Doxygen 风格的注释:

  1. 文件头(包括 头文件 .h 和 源文件 .cpp)

    主要用于版权声明,描述本文件的功能,以及作者、版本信息等。

  2. 类的定义

    主要用于描述类的功能,同时也可以包含使用方法、注意事项的 brief description。

  3. 类的成员变量定义

    对该成员变量进行 brief description。

  4. 类的成员函数定义

    对该成员函数的功能进行 brief description。

  5. 函数实现

    对函数的功能、参数、返回值、需要注意的问题、相关说明等进行 detailed description。


C++ Comment Style


Doxygen 支持多种注释风格,比如 JavaDoc-like 风格,Qt 风格等。在写 C++ 代码时,我们应该遵守 C++ 的行注释风格,所谓行注释风格,是指一般 C++ 程序员避免使用 C 风格的注释符号 /* */,而是使用 3 个连续的 / 作为注释的开头。除了这个区别之外,其他部分和 JavaDoc 风格类似:

  • 一个对象的 brief description 用单行的 /// 开始,并且写在代码前面。一般 brief 写在头文件中,对象的声明之前。

  • 一个对象的 detailed description 用多于两行的 /// 开始,并且写在代码前面。如果注释长度不足两行,第二行的开头仍要写出。一般 detailed 写在源文件中,对象的定义之前。

  • 如果一段代码既是声明也是定义,则 brief 和 detailed 写在一起。使用 \brief 命令,并且使用空行将两者分开。一般 brief 写在头文件中,对象的声明之前。

      #!C++
      /// \brief A brief description.
      ///
      /// A detailed description, it
      /// should be 2 line at least.
    

下面是代码模板:

License

使用 DoxygenToolKit 自动生成的 Lisence 即可。

File header


#!c++
/// \file file_name.h
/// \brief Head file for class Ctest.
/// 
/// A detailed file description.
///
/// \author author_name
/// \version version_number
/// \date xxxx-xx-xx

Namespace

namespace 的注释方式:

#!c++
/// \brief A brief namespace description.
///
/// A detailed namespace description, it
/// should be 2 lines at least.
namespace test
{

}

Class

class 的定义和声明都在头文件中,所以使用下面这种 brief 和 detailed 结合的方式:

#!c++
/// \brief A brief class description.
///
/// A detailed calss description, it
/// should be 2 lines at least.
class test
{

}

member function

对于成员函数,

  • 若是在头文件的声明处,使用 brief

  • 若是在源文件的定义处,使用 detailed

  • 若是在头文件处,声明和定义重合,使用 brief + detailed

member variable

对于成员变量,在行末使用 ///<

Function

brief:

单行的 /// 注释:

#!c++
/// A brief function description.

detailed:

至少两行 /// 的注释:

#!c++
/// This is the detailed description, it
/// should be 2 lines at least.

在 detailed description 中还可以添加一些 structural command,常用的有 \param\return\see\note\warning 等:

#!c++
/// This is the detailed description, it
/// should be 2 lines at least.
///
/// \param p1 Brief description for p1
/// \param p2 Brief description for p2
/// \return Brief description for return value
/// \note something to note.
/// \warning Warning.
/// \see See-also

brief + detailed:

如果函数声明和定义重合,则 brief 和 detailed 合在一起,并且使用 \brief 命令,格式如下:

#!c++
/// \brief A brief function description.
/// 
/// A detailed description, it
/// should be 2 lines at least.
///
/// \param p1 Description for p1.
/// \param p2 Description for p2.
/// \return Description for return value.
bool test(int n1, char c1);

在 Doxgyen 的 manual 里面有:

Unlike most other documentation systems, doxygen also allows you to put the documentation of members (including global functions) in front of the definition. This way the documentation can be placed in the source file instead of the header file. This keeps the header file compact, and allows the implementer of the members more direct access to the documentation. As a compromise the brief description could be placed before the declaration and the detailed description before the member definition.

Doxygen 允许注释出现在对象的定义之前,所以我们可以将注释写在源文件中,而不是头文件中。这样做的好处是使头文件更加紧凑、代码的实现者阅读起来也更加直观。所以我们采用的方案是:

  • 在函数声明前写 brief,在函数定义前写 detailed。

  • 对于 inline 函数,使用 brief,尽量保持简洁,不要多于一行。

Variable

变量一般使用 ///< 方式即可:

#!c++
int m_a; ///< brief description for variable m_a
double m_b;  ///< brief description for variable m_b

如果需要进行详细描述,则采用类似函数注释的方法(brief + detailed):

#!c++
/// \brief A brief description.
///
/// A detailed description, it
/// should be 2 lines at least.
float m_c;

Enum & Struct

类似于 Variable 的注释方式:

#!c++
/// \brief A brief description.
/// 
/// A detailed description, it
/// should be 2 lines at least.
enum Tenum {
    em_1; ///< enum value em_1
    em_2; ///< enum value em_2
    em_3; ///< enum value em_3
}
emVar; ///< enum variable.

Others

TODO 命令:

#!c++
/// \todo Task1 to do
/// \todo Task2 to do

BUG 命令:

#!c++
/// \bug Bug1 to be fixed
/// \bug Bug2 to be fixed


P.S.

从网上找到一个Doxygen for C 的示例:

Doxygen usage example (for C)

里面有一些注释方法很有借鉴意义,可以当作模板来用。

P.P.S

又找到一份注释规范的文档,写的挺好,值得一看。

C++注释规范


Ref

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,733评论 0 38
  • 本文由 伯乐在线 - 艾凌风 翻译。未经许可,禁止转载! 英文出处: Steve Emms。欢迎加入翻译组。 Bo...
    软体动物Ai阅读 2,451评论 2 47
  • 这个世界上有一群人和一群非人类,他们在默默的为这个世界的和平做出努力,而我也是其中一员。 我和妹妹都是这样的人,我...
    爱梦的我阅读 60评论 0 0
  • 当我们的朋友圈,被”阿尔法狗“、”深度学习“、”GPU“、”AI创投“、”七位数年薪“这样的热词逐步填满的时候,A...
    黑科技老K阅读 209评论 0 0