使用doxygen

使用doxygen

  撰文 / K.Young          翻译 / 马维达

( 已发表在《程序员》2002年第3期上)

一、介绍

GLAST 软件已采用 doxygen ( GNUGPL 软件)来作为文档工具,本文将对其进行简单的介绍。要了解更详细的信息及下载 doxygen 程序,请访问网站 什么是 doxygen 呢?下面的介绍录自 doxygen 的网页:

“ doxygen 是一种用于 C++ 、 IDL ( Corba 、 Microsoft 和 KDE-2DCOP 风格)和 C 的文档系统。它可以通过三种方式来帮助你:

1.         它可以从一组标有文档的源文件中生成在线文档浏览器( HTML 格式),以及 / 或者离线参考手册( LATEX 格式)。同时还支持生成 RTF ( MS-Word )、 Postscript 、超链接 PDF 、压缩 HTML 和 UNIXman 页面格式的输出。文档是从源文件中直接提取的,从而十分容易保持文档和源码的一致。

2.       可配置 doxygen ,用以从没有标注文档的源文件中提取代码结构。这对于要在大量源文件中快速地找到所需的东西来说是非常有用的。通过 include 依赖图、继承图和协作图等手段(它们都是自动生成的),可以使不同成分之间的关系可视化。

3.       你甚至还可以“滥用” doxygen ,创建普通文档。”

二、 doxygen 注释风格

使用 doxygen 的第一步是在你的代码中插入 doxygen 风格的注释。你可以使用两种不同风格的 doxygen 注释:

Qt 风格,专用文档块看起来是这样的:
/*!
...text...
*/

还有单行版本:
file://!...onelineoftext... JavaDoc 风格,专用文档块看起来是这样的:
/**
 *...text...
 */

还有单行版本:
///...onelineoftext...
    从现在起我将在例子中使用 Qt 风格,但是你可以在你的代码中使用任何一种。

    你可以通过许多方式使用 doxygen 注释,以为你的代码编写文档。但下面的一种,我们感觉能够令人满意地工作。注意下面的注解仅仅说明应该如何使用 doxygen 注释;你所应该包含在注释里的信息是另外一回事,并不在这里进行讨论。

    我们的基本想法是你想要为每个类、以及该类的重要成员函数增加短注释和长注释。短注释应给出类或函数的基本信息的简要描述。而较长的注释,不奇怪,应该给出更长和更完整的描述。类的短注释和长注释,以及成员函数的简短描述,将放在头文件中。成员函数的长注释将出现在成员函数的实现出现的地方。

    下面的例子演示这一注释系统(向 Alexandre 、 Regis 和 Jose 道歉,我在此过程中“黑”了他们的代码)。假定我们正在为一种叫作 CalPack 的 CMT 包工作,它有一个单独的类 CsICluster ,头文件叫作 CsICluster.h ,在 CalPack/ 目录中;而实现文件叫作 CsICluster.cpp ,在 src/ 目录中。文件 CalPack/CsICluster.h 是这样的:

    而文件 src/CsICluster.cpp 是这样的:

    注意,你可能会选择省略那些含义清楚的成员函数的较长注释,这并不会导致任何问题。访问 文档。

    三、使用 mainpage.h 文件

    浏览上面的链接中的文档,你可能会注意到名为“ MainPage ”的链接(它指向 index.html )并不是十分有趣。这是一个特殊的页面,在这里你可以添加与你的 doxygen 页面描述的所有类有关的文档。在我们的例子中只有一个单独的类,但是你可以使用 doxygen 来处理如你所选择的那么多的类。一种自然的划分是为每一个 GLASTCMT 包都创建 doxygen 页面。于是合乎想像地,我们想要这个主页面成为对正在被讨论的包的描述;在我们的个案中就是 CalPack 包。

    那么我们怎么为此主页面增添内容呢?你需要使用 doxygen 的特殊命令 \mainpage 。在 doxygen 中有一些特殊命令,它们放在 doxygen 注释中以增强你所生成的文档。例如在类描述中,我们已经使用了 doxygen 特殊命令 \author 。

    命令 \mainpage 指定用以填充主页面的注释的内容。 doxygen 允许你将此命令放在任何注释中。 但是, GLAST 的惯例是将该命令放入文件 mainpage.h 中。这个 mainpage.h 文件应该只包含一条使用 \mainpage 命令的注释。并且这个文件应该放在头文件目录中,也就是,与包自己的名字相同的目录。

    于是我们为 CalPack 包创建一个 CalPack/mainpage.h 文件:

    注意在 \mainpage 命令后面的字句是主页面的标题。我们还引入了 \section 命令,其语法你应该可以推论得出。上面的注释所产生的 HTML 输出见 类的文档。

    四、包含图像

    另一个有趣的命令(对此我们希望实施某种标准)是 \image 命令。此命令用于在你的文档中插入图像。 \image 命令可以用在任何注释中。此命令的语法如下所示:

    \imagehtmlmypicture.gif

    尽管我们仅仅显示了 HTML 输出, doxygen 还可以用于创建 latex 、 man 或 rtf 文档。但是,并非所有格式都支持所有的图像类型。因而,有必要指定你所希望在其中包含的图像的输出格式。 doxygen 将在你通过叫作 IMAGE_PATH 的变量所指定的目录中查找图像文件。对此变量的设置以及其他的 doxygen 缺省值将在下面的“运行 doxygen ”中解释。 目前,只需注意 GLAST 的惯例是在你的文档中为给定的包所使用的全部图像文件都将放在叫作 doc/images/ 的目录中。

    于是假设有一个叫作 figuresim2.gif 的图像文件在目录 doc/images/ 中,我们想要将其插入我们的主页面,我们可以通过简单的改动来完成:

    所产生的 HTML 输出见 五、运行 doxygen

    你可以通过两种方式来运行 doxygen 。注意两种方法都需要你将 doxygen 安装在你的访问路径上。请访问 doxygen 的主页以获得下载和设置可执行程序的相关信息。

    1)        对于 vcmt 用户,你可以简单地点击 doxygen 区域中的“ create ”按钮,从而为你选择的所有包创建 HTML 文档。然后点击“ examine ”来查看页面。

    2)      对于非 vcmt 用户,你首先需要创建一个 Doxyfile 。 Doxyfile 允许你设置运行 doxygen 所需的所有设置和路径。要创建 Doxyfile ,执行

    doxygen–g<filename>

    “ filename ”指定含有 doxygen 设置的文件的名字;如果不指定名字,该文件就叫作“ Doxyfile ”。使用 Doxyfile 时你可能想要设置一些参数。我将提及三个有趣的参数,其他的请参考 doxygen 主页。

    ● INPUT :此参数指定 doxygen 在其中搜索源码的目录。对于上面的例子,需要设置

      INPUT=srcCalPack

    ● FILE_PATTERNS :此参数指定 doxygen 所要解析的文件的类型。对于上面的例子,
       需要设置

      FILE_PATTERNS=*.cpp*.h

    ● IMAGE_PATH :此参数指定 doxygen 在哪里查找使用 \image 命令包含的图像。对
       于上面的例子(并且作为 GLAST 的惯例),需要设置

      INCLUDE_PATH=doc/images

    一旦你设置了这些参数以及其他任何你想要改变的参数,你就可以运行 doxygen 了。假定你的 Doxyfile 就叫作“ Doxyfile ”,执行

    doxygenDoxyfile

    它将解析你指定的所有文件。缺省地, HTML 输出将被放在叫作 html/ 的目录中(这也可以在 Doxyfile 中改变)。

    译者注:

    1.        doxygen 有内建的多语言支持,目前支持 24 种语言,其中包括中文。具体用法请参考 doxygen 的参考手册。

    2.      GLAST 是 TheGammaRayLargeAreaSpaceTelescope (伽玛射线大区域空间望远镜)的缩写。主页在 访问其源码。 /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT:7PT'TIMESNEWROMAN'"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="MARGIN-LEFT:18PT;TEXT-INDENT:-18PT;WORD-BREAK:BREAK-ALL"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="MARGIN-LEFT:18PT;TEXT-INDENT:-18PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="MARGIN-LEFT:18PT;TEXT-INDENT:-18PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="TEXT-INDENT:21PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="TEXT-INDENT:21PT;WORD-BREAK:BREAK-ALL"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="TEXT-INDENT:21PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="TEXT-INDENT:21PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="TEXT-INDENT:21PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="TEXT-INDENT:21PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /LICLASS=MSONORMALSTYLE="MARGIN-BOTTOM:12PT;TEXT-ALIGN:LEFT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="MARGIN-LEFT:18PT;TEXT-INDENT:-18PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT:7PT'TIMESNEWROMAN'"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT:7PT'TIMESNEWROMAN'"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PCLASS=MSONORMALSTYLE="TEXT-INDENT:21PT;WORD-BREAK:BREAK-ALL"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /PALIGN=CENTERCLASS=MSONORMALSTYLE="TEXT-ALIGN:CENTER;TEXT-INDENT:42PT"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312"> /SPANSTYLE="FONT-FAMILY:楷体_GB2312">

    你可能感兴趣的:(使用doxygen)