doxygen如何生成JAVA文档_有用Doxygen生成文档的吗?发一篇Doxygen的使用文档给大家,从网上搜来的。...

第二章:Documenting the code

特殊的注释

一种特殊的注释是带有一些额外标记的C/C++注释块,这样doxygen就知道需要将其加入到文档中了。

对于每个代码块都有两种注释,这两种注释组成了文档:一种是brief 描述另一种是detailed 描述,都是可选的。可以有多于一个的brief 描述和detailed 描述,但是是无效的。

顾名思义,一个brief描述只有一行,而detail描述则是更长更详尽的文档。

有几种方式添加一个detail描述:

1.  使用JavaDoc风格,包含一个C风格的注释块

/**

* ... text ...

*/

2.  使用Qt风格

/*!

* ... text ...

*/

这中间的*都是可选的,因此

/*!

... text ...

*/

也是有效的

3.  第三种风格是至少使用两个C++注释行,每行加多一个/或者是!

///

/// ... text ...

///

//!

//!... text ...

//!

4.     有些人喜欢将注释变得比较醒目,可以这样来作

/

/// ... text ...

/

有以下方式添加brief注释

1.  一种是在上述注释块中使用\brief,然后一个空行后跟着Detail注释

/*! \brief Brief description.

*         Brief description continued.

*

*  Detailed description starts here.

*/

2.  如果配置文件中JAVADOC_AUTOBRIEF被设为YES,则使用JavaDoc风格注释块将自动开始一个brief注释,这个注释将以“.”后跟一个空格或新行结束

/** Brief description which ends at this dot. Details follow

*  here.

*/

同样可以应用到多行的C++风格注释中

/// Brief description which ends at this dot. Details follow

/// here.

3.  第三种可以使用一种特殊的C++风格注释,每次不超过一行

/// Brief description.

/** Detailed description. */

//! Brief descripion.

//! Detailed description

//! starts here.

注意后一个例子中的空行,Doxygen用他来分开brief描述和detail描述。在此情况下JAVADOC_AUTOBRIEF也应设置为NO

如你所见,doxygen很灵活,下面这种写法是非法的

//! Brief description, which is

//! really a detailed description since it spans multiple lines.

/*! Oops, another detailed description!

*/

因为doxygen只允许一个brief和一个detail描述

更进一步,如果一个brief描述在 declaration前,一个在code前,那么将使用declaration前的那个。对于detailed描述也是如此,definition前的那个比declaration前的有高优先级。

这里有一段Qt风格的C++例子:(注意这一段需要仔细研究,改写掉注释宏的代码)

//!  A test class.

/*!

A more elaborate class description.

*/

class Test

{

public:

//! An enum.

/*! More detailed enum description. */

enum TEnum {

TVal1, /*!< Enum value TVal1. */

TVal2, /*!< Enum value TVal2. */

TVal3  /*!< Enum value TVal3. */

}

//! Enum pointer.

/*! Details. */

*enumPtr,

//! Enum variable.

/*! Details. */

enumVar;

//! A constructor.

/*!

A more elaborate description of the constructor.

*/

Test();

//! A destructor.

/*!

A more elaborate description of the destructor.

*/

~Test();

//! A normal member taking two arguments and return an integer value.

/*!

\param a an integer argument.

\param s a constant character pointer.

\return The test results

\sa Test(), ~Test(), testMeToo() and publicVar()

*/

int testMe(int a,const char *s);

//! A pure virtual member.

/*!

\sa testMe()

\param c1 the first argument.

\param c2 the second argument.

*/

virtual void testMeToo(char c1,char c2) = 0;

//! A public variable.

/*!

Details.

*/

int publicVar;

//! A function variable.

/*!

Details.

*/

int (*handler)(int a,int b);

};

这些单行注释包括一个brief描述,而multi-line注释块包含一个更详细的描述。

Brief描述包含在class,namespace或file的member的预览中,小号的斜体字(通过将BRIEF_MEMBER_DESC设置为NO可以关掉这些brief描绘)。缺省的brief描述是detailed描述的第一句话(通过将REPEAT_BRIEF设置为NO可以改变此设置)。在Qt风格中brief和detailed都是可选

缺省的,JavaDoc风格的注释块和Qt风格的注释同样有效。这并不是根据JavaDoc规格的,而是注释的第一行被认为是brief描述。要打开此设置,将JAVADOC_AUTOBRIEF设置为YES。用一个“.”来作分隔,或者使用一个“\”:

/** Brief description (e.g.\ using only a few words). Details follow. */

设置JavaDoc style和JAVADOC_AUTOBRIEF为YES:

/**

*  A test class. A more elaborate class description.

*/

class Test

{

public:

/**

* An enum.

* More detailed enum description.

*/

enum TEnum {

TVal1, /**< enum value TVal1. */

TVal2, /**< enum value TVal2. */

TVal3  /**< enum value TVal3. */

}

*enumPtr, /**< enum pointer. Details. */

enumVar;  /**< enum variable. Details. */

/**

* A constructor.

* A more elaborate description of the constructor.

*/

Test();

/**

* A destructor.

* A more elaborate description of the destructor.

*/

~Test();

/**

* a normal member taking two arguments & return an integer value.

* @param a an integer argument.

* @param s a constant character pointer.

* @see Test()

* @see ~Test()

* @see testMeToo()

* @see publicVar()

* @return The test results

*/

int testMe(int a,const char *s);

/**

* A pure virtual member.

* @see testMe()

* @param c1 the first argument.

* @param c2 the second argument.

*/

virtual void testMeToo(char c1,char c2) = 0;

/**

* a public variable.

* Details.

*/

int publicVar;

/**

* a function variable.

* Details.

*/

int (*handler)(int a,int b);

};

和大多数文档系统不一样,doxygen也允许你将将member注释放在definition之前。这种方式下,注释可以写在.cpp文件中而非.h文件中。这样头文件就显得比较简洁,同时member前也直接有注释。作为一种妥协,brief描述可以放在member的declaration前,detailed描述可以放在definition前。

在members之后添加注释

如果需要为file,struct,union,class或enmu的members添加注释,并且你需要将这些注释放在compound之内,可以考虑将注释块放在member的后面。这样就要在注释块中添加一个“

下面是个例子:

int var; /*!< Detailed description after the member */

这个块在用来在在一个member之后添加一个注释块(Qt风格)

还有一种方式

int var; /**< Detailed description after the member */

或者是

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

//!<

或者是

int var; ///< Detailed description after the member

///<

多数情况下只是需要在一个member后添加一个brief描述,如下:

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

或者

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

注意这些块有相同的结构,不过是使用了

这里有个使用注释块的例子:

/*! A test class */

class Test

{

public:

/** An enum type.

*  The documentation block cannot be put after the enum!

*/

enum EnumType

{

int EVal1,     /**< enum value 1 */

int EVal2      /**< enum value 2 */

};

void member();   //!< a member function.

protected:

int value;       /*!< an integer value */

};

Click here for the corresponding HTML documentation that is generated by doxygen.

警告:

这些块只能用来给members和parameters注释。不能用来给files,classes,unions,structs,groups,namespaces和enums添加注释。还有下一节中论述的structural commands在这种注释块中被忽略掉了

Documentation at other places

截止目前,我们谈到的注释块都是在file,class或namespace的declaration或definition之前还有是在member的前后。尽管这通常已经达到目的,但有时要将注释放在其他地方。为一个文件添加注释也是有必要的,但是没有“在文件之前”这种地方。Doxygen允许将注释块放在其他的任何地方(也有不允许的:例如函数体内或一个标准的C-style注释块中)。

这样作比较麻烦的是需要在注释块中添加一些structural命令。

Structual commands(像其他的commands)以“\”开头,或是一个“@”(使用JavaDoc风格),后面是命令名和一或多个参数。例如,如果你想给上面的Test类添加一个注释:

/*! \class Test

\brief A test class.

A more detailed class description.

*/

这里特殊命令“\class”用于指出该注释块中含有对Test类的注释。还有一些其他的structural命令:

•\struct to document a C-struct.

•\union to document a union.

•\enum to document an enumeration type.

•\fn to document a function.

•\var to document a variable or typedef or enum value.

•\def to document a #define.

•\file to document a file.

amespace to document a namespace.

•\package to document a Java package.

•\interface to document an IDL interface.

参看Special Commands获得更详细资料。

为了注释一个类中的member,首先要对该类作注释。同样的问题上升到namespace。要注释一个全局的function,typedef,enum或preprocessor定义,你需要首先定义包含它的文件(通常情况下是一个.h文件,因为这些文件包含可以export到其他源文件的信息)。

让我们重复一下,因为常常被忽视:要注释一个global objects(functions,typedefs, enum,macros等),必须注释它们所在的.h文件。换句话,至少要这样注释一下

/*! \file */

或这样一个

/** @file */

行在该文件中

这里用个名为structcmd.h的C头文件,讲解如何使用structal commands。

/*! \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.

*/

/*! \fn size_t write(int fd,const char *buf, size_t count)

\brief Writes \a count bytes from \a buf to the filedescriptor \a fd.

\param fd The descriptor to write to.

\param buf The data buffer to write.

\param count The number of bytes to write.

*/

/*! \fn int read(int fd,char *buf,size_t count)

\brief Read bytes from a file descriptor.

\param fd The descriptor to read from.

\param buf The buffer to read into.

\param count The number of bytes to read.

*/

#define MAX(a,b) (((a)>(b))?(a):(b))

typedef unsigned int UINT32;

int errno;

int open(const char *,int);

int close(int);

size_t write(int,const char *, size_t);

int read(int,char *,size_t);

Click here for the corresponding HTML documentation that is generated by doxygen.

Because each comment block in the example above contains a structural command, all the comment blocks could be moved to another location or input file (the source file for instance), without affecting the generated documentation. The disadvantage of this approach is that prototypes are duplicated, so all changes have to be made twice! Because of this you should first consider if this is really needed, and avoid structural commands if possible. I often receive examples that contain \fn command in comment blocks which are place in front of a function. This is clearly a case where the \fn command is redundant and will only lead to problems.

因为上例中每个注释块都包含一个结构化命令,所有注释快都可以放在其他位置或input文件(例如source file),都不会影像文档的生成。这种做法的缺点是原型被复制了,所以每次都要写两遍。因为如此,你应该首先考虑是否有必要,并尽可能避免structural commands。我常常收到含有这种文件,在一个函数前的注释中有“\fn”命令。这样是冗余的,导致容易出错。

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

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

相关文章

【转】构建Android平台Google Map应用

http://www.moandroid.com/?p1360 Android 的新版本提供了的功能&#xff0c;通过这段视频&#xff0c;大家可以先简单了解下&#xff1a; Android 提供的地图&#xff08;Map&#xff09;功能可能是广大开发者非常关心的一个部分。到目前为止&#xff0c;开发内嵌式地图应用的…

将虚拟机转换成模板

在制作模板前&#xff0c;先要准备一个干净的操作系统&#xff0c;或者安装上经常使用的软件在虚拟机中&#xff0c;安装好后&#xff0c;将其正常关机&#xff0c;之后就可以转换成模板了。转换后的虚拟机将不会在主机管理中看到&#xff0c;而只能在模板中看到。克隆转换时克…

假如你学过高数,那你这一辈子都不会忘记这个人

▲ 点击查看2020年3月&#xff0c;菲列兹伦敦奖评奖委员会宣布&#xff0c;2020年度菲列兹伦敦奖将授予三位科学家&#xff0c;除开美国的 Vinokur 博士、以及德国的Steglich 教授以外&#xff0c;最后一位就是清华大学副校长、北京量子信息科学研究院院长薛其坤院士。薛其坤院…

在VHD文件上安装Windows 7或Windows 2008 R2

以下操作在VMware Workstation 6.5的虚拟环境中操作成功。安装方法&#xff1a;1、以Windows 7或Windows 2008 R2安装光盘启动计算机2、在屏幕出现“现在安装”&#xff0c;同时按ShiftF10&#xff0c;出现一个命令提示窗口。3、依次输入以下命令diskpartlist diskselect disk …

.Net Core with 微服务 - 分布式事务 - TCC

上一次我们讲解了分布式事务的 2PC、3PC 。那么这次我们来理一下 TCC 事务。本次还是讲解 TCC 的原理跟 .NET 其实没有关系。TCC Try 准备阶段&#xff0c;尝试执行业务Confirm 完成业务Cancel 回滚准备阶段的业务TCC 事务其实是 2PC 的一个扩展。上一次我们说了 2PC &#xff…

第10章-管理Hadoop集群-hadoop 安全模式相关知识点

为什么80%的码农都做不了架构师&#xff1f;>>> 1、namenode启动时&#xff0c;namenode节点都做了哪些动作&#xff1f;fsimage和edits有什么变化&#xff1f; 2、namenode什么时候开始监听RPC和HTTP请求&#xff1f; namenode启动时&#xff0c;首先将映像文件(f…

oracle挂证多少钱一个月_惊呆,一条sql竟然把Oracle搞挂了

一条sql就能把oracle搞挂了&#xff0c;真的是不敢相信啊&#xff0c;前几天生产上确实出现了这样一个故障&#xff0c;我们来一起做一个事件回放。系统介绍系统架构见下图&#xff1a;fileapplication1和application2是一个分布式系统中的2个应用&#xff0c;application1连接…

linux图形界面鼠标变成小手_加载Linux系统,树莓派变身桌面电脑

开始正文前&#xff0c;我们想听听娃说了什么操作系统&#xff0c;英文名叫做Operation System&#xff0c;简写为OS&#xff0c;是电子设备运行的基础软件&#xff0c;按运行的设备类型来分&#xff0c;操作系统分为手机操作系统&#xff0c;桌面电脑操作系统和服务器操作系统…

二叉查找树转换成有序的双向链表

首先对于二叉查找树的定义和性质&#xff0c;以及如何得到二叉查找树某个节点的子树下的最大值和最小值和插入一个值的内容可以参考这两篇文章&#xff1a; &#xff08;1&#xff09;http://www.cnblogs.com/chenping-987123/archive/2010/09/25/1834341.html &#xff08;2&a…

就你这个求婚态度,能嫁给你才怪!

1 兄弟&#xff01;哪有求着婚还走神的&#xff1f;&#xff01;▼2 喝奶茶专用口罩&#xff01;▼3 把广东茶楼的菜都点一遍是什么体验&#xff1f;▼4 你觉不觉得这个门锁有点像托马斯的小火车▼5 手里的塑料袋像极了塑料兄弟情▼6 小朋友看《喜羊羊》看到的是坏人的愚…

Remoting and MSMQ 结合做的一个DEMO

真的非常感谢CnBlogs.com,因为有很多教程里写的知识点并不全面,而且也没附带例子.通过这里我学习到了很多很多.希望网站能越办越好哦.下面是我学习分布式开发时写的一个小demo,当然功能有限,技术也很低.希望大师们能拍拍砖,不吝赐教.呵呵软件运行的一个截图下面说说流程吧,1:利…

再聊一次值类型和引用类型

C#值类型&#xff0c;作为函数形参&#xff0c;形参被修改&#xff0c;不影响原值。这是我们在初始学习编程时需要记住的内容&#xff0c;我们也是一直这样践行的。先说结论&#xff1a;这是不准确的。为什么提出这样看似很浅显的问题&#xff0c;是因为有次我在使用ArraySegme…

java+字节码工具64位_jclasslib 下载-jclasslib 32位64位(java字节码查看工具) 5.1 官方版 - 河东下载站...

jclasslib是款免费的开源java字节码的查看工具&#xff1b;它支持进行查看您需要进行使用汉字运用到的Java字节码&#xff0c;并且还拥有一个的类库来让开发者进行读取&#xff0c;包括了修改、对JavaClass文件、字节码的写入等&#xff1b;用户这进行使用的过程中&#xff0c;…

分组行号

怎样对分组里的行加上序号&#xff0c;要求每个组里行的序号从1开始&#xff01; --------------------------------------------------------------- 用计算域&#xff0c;放在明细区&#xff1a; getrow() - first(getrow() for group 1) 1 ---…

ado filter 多条记录_注意!武汉江南中心绿道武九线综合管廊工程开工,青山区多条道路通行规则有变...

楚天都市报10月29日(记者吴昌华 通讯员 李佳 陈菲)今日记者从武汉交管部门获悉&#xff0c;本周六&#xff0c;10月31日&#xff0c;武汉市江南中心绿道武九线综合管廊工程开始施工&#xff0c;青山区多条道路通行规则有变&#xff0c;部分道路禁止通行。交管部门提供详细绕行建…

深度学习框架再次升级,它们都有什么优点?

全世界只有3.14 % 的人关注了爆炸吧知识经过几年的发展&#xff0c;深度学习方法摧枯拉朽般地超越了传统方法&#xff0c;成为人工智能领域最热门的技术。之后&#xff0c;谷歌、亚马逊、百度、Facebook 纷纷开源了自己的深度学习框架。而支撑AlphaGo的核心技术架构--TensorFlo…

SQL Server 2005的安装,SQL Server 2005系列之一

最近复习SQL Server 2005,忽然有了写系列的打算&#xff0c;也不知道能不能写好&#xff0c;今天先写一篇关于SQL Server 2005的安装的博文吧。和往常一样&#xff0c;我们先来看看SQL Server 2005到底是个什么东西&#xff1f;SQL Server 2005是一种以高性能、高可靠性和可用性…

java iter是否存在_Java中ListIterator和Iterator的区别以及ListIterator的应用

Java中ListIterator和Iterator详解与辨析 在使用java集合的时候&#xff0c;都需要使用Iterator。但是java集合中还有一个迭代器ListIterator,在使用List、ArrayList、LinkedList和Vector的时候可以使用。这两种迭代器有什么区别呢&#xff1f;下面我们详细分析。这里有一点需要…

Quartz - 作业调度框架-插件化开发

背景大部分业务都是基于定时的任务&#xff0c;特别适合使用quartz这类框架解决定时问题。具体quartz的使用&#xff0c;看官方文档就可以了。下面谈谈对quartz插件化的封装。我们使用quartz.plugin。然后在quartz_jobs.xml方法里面定义了schedule&#xff0c;其中灵活的地方在…

cgi备份还原和ghost有什么区别_手动GHOST还原重装系统详细教程

一键重装虽好&#xff0c;但也不是万能的。俗语说&#xff1a;治标不治本。也许你懂得用各种一键备份还原工具重装&#xff0c;但不一定懂得手动GHOST重装。为此&#xff0c;吻妻为大家分享一下如何手动GHOST还原重装系统&#xff0c;本教程步骤虽多&#xff0c;但很多都是点“…