搭建好整个环境后,稍微浏览一下注释规范选择一种喜欢的风格,然后按照简单配置指南配置好测试一下效果。更详细的内容可根据需求在使用中学习、查阅。
其实在熟悉了Doxygen使用方法后,不再限于某种编程平台的代码比如Qt、VS等,也不限于某种编程语言C、C++、Java等,不限于在windows还是在linux上使用。Doxygen关注的是代码文件中的文档注释(希望在文档中出现的注释,遵循doxygen规定的注释格式即可),只要有项目文件夹就可以使用了。
Linux有自己的安装、配置、使用的方法,暂时还没用到,就不介绍了。
为代码写注释一直是大多数程序员有些困扰的事情。当前程序员都能接受为了程序的可维护性、可读性编码的同时写注释的说法,但对哪些地方应该写注释,注释如何写,写多少等这些问题,很多程序员仍然没有答案。而doxygen就提供了一几种参考的注释风格。
更头痛的是写文档,以及维护文档的问题。 开发人员通常可以忍受编写或者改动代码时编写或者修改对应的注释,但之后需要修正相应的文档却比较困难。
如果能从注释直接转化成文档,对开发人员无疑是一种福音。而doxygen就能把遵守某种格式的注释自动转化为对应的文档。
当分析一个很复杂的项目源代码时,如何有效的分析函数间的调用关系呢?可以使用doxygen和graphviz来自动分析函数间的调用关系。
Doxygen 是基于GPL的开源项目,是一个非常优秀的文档系统,初始版本的Doxygen借鉴了一些老版本DOC++的代码;随后,Doxygen源代码由Dimitri van Heesch重写。
这个软件包包括了一个GUI界面的前端工具,可以帮助我们方便创建Doxygen配置文件和生成目标文档。
详细请看http://www.oschina.net/p/doxygen
1.Doxygen 可以根据代码注释生成文档的工具,因此比较容易保持更新。
2.Doxygen 可以交叉引用文档和代码,使文件的读者可以很容易地引用实际的代码。
在大多数unix(包括linux),windows家族,Mac系统上运行,
C++, C, Java,Objective-C, IDL(Corba和Microsoft 家族)语言,Fortran,VHDL,部分支持PHP和C#语言和D语言,
包括HTML、latex、RTF、ps、PDF、压缩的HTML和unix manpage。
由于只是工具的使用,这里只介绍使用步骤。
主要可以分为:
1)第一次使用需要安装doxygen的程序和插件
2)生成doxygen配置文件
3)编码时,按照某种格式编写注释
4)生成对应文档
微软的chm文件编译器。
是一种开源的将结构化信息展示成抽象图和网络的工具,用于网络,生物信息,软件工程,数据库和网站设计,机器学习以及其他技术领域的可视性接口。
全部资源:
doxygen的安装包及插件:
在准备好所有资源后建立如下文件夹,以D盘为例:
版本不相同应该同样可以搭建成功
下载地址
1.双击doxygen-1.8.20-setup
2.选择“I accept the agreement”–>Next
3.点击Browse…–>选择安装目录即D:\Doxygen\doxygen1.8.20–>OK–>Next
4.一路Next–>Install–>Next–>Finish
5.完成
下载地址
1.双击graphviz-2.38
2.点击–>Next
3.点击Browse…–>选择安装目录即D:\Doxygen\graphviz2.38–>OK–>Next
4.一路Next–>Close
5.完成
如果mac安装过程中弹出“打不开 XXX,因为它来自身份不明的开发者”请进入如下网址寻找解决办法:
百度方法
下载和安装 chm 编译器,我们使用微软古老的 HTML Help Workshop 1.3,这个软件N久没更新了
下载地址
1.双击htmlhelp1.3
2.点击–>Yes–>是
3.点击Browse…–>选择安装目录即D:\Doxygen\htmlhelp1.3–>OK
4.一路Next–>Close
5.完成
计算机中一般自带了一个htmlhelp,也可以直接使用这个自带的。一般安装htmlhelp1.3不会出现任何问题,只会提示计算机中已经有htmlhelp的新版本了。
本次安装时遇到一个问题:
error creating process <C:\Users\楸\AppData\Local\Temp\IXP000\setup.exe>.Reason:系统找不到指定文件
解决方法:将用户变量的TEMP/TMP变量改为和系统变量一样的值就可以正常安装了。
帮助–>About Qt Creator
下载地址
将动态库复制到Qt安装目录下:
重启QtCreator,中才会出现插件Doxygen的选项:
打开Qtcreator–>帮助–>关于插件–>确认Doxygen已勾选
Qtcreator–>工具–>选项–>查看左侧有没有Doxygen
注释应该怎么写,写多还是写少。过多的注释甚至会干扰对代码的阅读。
写注释的一个总的原则就是注释应该尽量用来表明作者的意图
而不应该是对代码的重复或者解释,看代码可能更容易理解。
推荐的写注释的过程是**首先使用注释勾勒出代码的主要框架 **,然后根据注释撰写相应的代码。
下面是一些写注释时需要注意的要点:
1.通过注释解释为什么这么做、或者要做什么,使代码的读者可以只阅读注释理解代码;
2.对读者可能会有疑问的地方进行注释;
3.对关键的控制结构进行注释,单一目的的语句集进行注释;
4.对于难于理解的代码,进行改写,而不要试图通过注释加以说明;
5.避免对单独语句进行注释;
6.对数据定义进行注释,而不是对其使用过程进行注释;
7.多个函数公用的变量进行详细地注释。
8.对各种主要的数据结构进行详细地注释。
9.输出的函数进行详细地注释。
10.对数据和函数的边界、使用前提等进行注释;
与其他大多数文档系统不同,doxygen 允许你在定义的前端放置文档成员(包括全局函数),这种方法使得文档能放在源文件而不是头文件中,它保持了头文件的兼容性,允许成员的执行者直接访问文档。
折中的方法是简明描述放在声明之前,而细节描述放在成员定义之前。
需要注意的是doxygen并不处理所有的注释,doxygen重点关注与程序结构有关的注释,比如:文件、类、结构、函数、变量、宏等注释,而忽略函数内变量、代码等的注释。
若需要通过Doxygen生成漂亮的文档,一般有如下几个地方需要使用Doxygen支持的风格进行注释:
主要用于声明版权,描述本文件实现的功能,以及文件版本信息等
主要用于描述该类的功能,同时也可以包含使用方法或者注意事项的简要描述
在类的成员变量上方,对该成员变量进行简要地描述
在类定义的成员函数上方,对该成员函数功能进行简要描述
在函数的实现代码处,详细描述函数的功能、参数的含义、返回值的含义、使用本函数需要注意的问题、本函数使用其他类或函数的说明等
对于任何一行代码来说,会有两种(也可能是三种)注释方式,并且会一同放置到文档中,一种是简明描述,另一种是细节描述。而方法和函数也可能使用第三种描述的方式,它被称为“in body”描述,并包含方法和函数内所有注释块之间的联系。
详细描述(detailed description):要提供足够的长度以包容更多的细节文档。
可使用 QT 风格,即在 C 注释风格基础上添加一个!字符,例子如下:
/*!
* ... text ...
*/
可使用 JavaDoc 风格,包含两个“*”开头的 C 注释风格,如同:
/**
* ... text ...
*/
第三种替代方式则使用至少两行的 C++注释块,在每行开始出添加一个斜杠或者惊叹号,这有两个例子:
///
/// ... text ...
///
//!
//!... text ...
//!
这种情况下,请使用一条空行作为文档块的结尾。
有些人喜欢在文档中使用他们自己的注释块,感觉更清晰。基于这样的目的,可能会用到以下的方式: (注意前两条斜杠结束普通注释块,后两条开始一个特殊注释块)
/********************************************//**
* ... text
***********************************************/
/
/// ... text ...
/
简述(brief):建议简明描述使用一个短小的单行方式。以 HTML 方式输出的简明描述可在文档行引用之处支持冒泡提示 。
类,名字空间或文件的成员概述中会包含简明描述,可使用 small italic 字体打印(这类描述能被隐藏,设置 BRIEF_MEMBER_DESC
为 NO)。
/// Brief description.
通常一行注释只会有一个简明描述,而多行注释块会包含一个更详细的描述。
多个细节描述被组合在一起,请注意假如这些细节描述被放置到代码的不同地方,那么能否找到只能取决于doxygen 对代码的解析程度而定。
默认情况下简明描述作为细节描述的第一条句子(可通过设定 REPEAT_BRIEF
为 NO 改变),在 QT 风格中简明描述和细节描述都是可选的。
不超过一行的 C++注释块,此类情况下将 JAVADOC_AUTOBRIEF
设置为 NO。空行用于分隔注释块中简明描述和细节描述:
/// Brief description.
/** Detailed description. */
//! Brief descripion.
//! Detailed description
//! starts here.
在出现第一个“.” 后跟一个空格或空白行处结束,可在之后紧跟细节描述。 可参考以下的例子:
//! Brief description, which is
//! really a detailed description since it spans multiple lines.
/*
*!Another detailed description!
*/
如果希望 QT 文档块自动将第一条句子作为简明描述,设置 QT_AUTOBRIEF
为 YES。
如果在配置文件中将QT_AUTOBRIEF
设置为 YES,同一个块中,在出现第一个“.” 后跟一个空格或空白行处结束,可在之后紧跟细节描述:
/*! \brief Brief description.
* Brief description continued.
*
* Detailed description starts here.
*/
JavaDoc 文档块与 QT 文档块规则类似,JavaDoc 不同的地方是,它会将文档块的第一句自动当成是简明描述。
可通过设置 JAVADOC_AUTOBRIEF
为 YES 使能此动作。如果你有效了此选项,需要在句子中放置一个“.”(点)来结束句子,并在点之后放置一个反斜杠或空格:
/** Brief description which ends at this dot. Details follow
* here.
*/
如果在配置文件中将 JAVADOC_AUTOBRIEF
设置为 YES,在出现第一个“.” 后跟一个空格或空白行处结束,可在之后紧跟细节描述:
/// Brief description which ends at this dot. Details follow
/// here.
如果你希望文档化一个文件、结构、联合、类以及枚举的成员,需要为复合体中的这些成员放置文档。有时希望放置在成员之后的文档块,可以替换掉原有的块,如同前面所介绍的特殊注释块。
在注释块中加入“<
” 标记(只使用“<
”),将前一个注释块替换后一个注释块。这些块都有相同的结构和意义
警告:
Doxygen 允许你将文档块放到任何位置(一个函数或一个 C 注释块的主体,是一个例外)。
到目前为止,我们假定文档块总是位于文件,类,名字空间的声明或定义的前端,或者处于它们成员的前后注释块中,尽管大多数时间这个约束是合适的。
有时出于别的原因要将文档放到其他位置,因为文件中不存在“文件前端”的位置而需要对文件进行文档化。
使用结构化命令在不影响生成文档的情况下,所有的注释块将被移动到另一个位置或者是输入文件(例如源文件)。在实际中你最好避免使用结构化命令,除非其他的需求迫使你这样做。
缺点:
我经常收到一些例子,注释块中包含\fn 命令并放置在函数前端。很明显\fn 命令字是多余的,而它只会带来问题。
结构化命令(和其他所有的命令一样)由一个反斜杠或“@”开始,如果你喜欢 JavaDoc
风格,紧跟一个命令字和若干参数。如:
/*! \class Test
\brief A test class.
A more detailed class description.
*/
这有一个特殊命令 \class 用于指示注释块包括类 Test 的文档。
其它特殊命令字
\struct 文档化一个 C 结构
\union 文档化一个联合
\enum 文档化一个枚举
\fn 文档化一个函数
\var 文档化一个变量,类型转换,枚举值其中之一
\def 文档化一个#define
\typedef 文档化一个类型转换\file 文档化一个文件
\namespace 文档化一个名字空间
\package 文档化一个 Java 包
\interface 文档化一个 IDL 接口
文档化一个 C++类成员,你必须先文档化 C++类,这同样适用于名字空间。
文档化全局对象(函数,类型转换,枚举,预处理定义宏,等等),你必须先文档化包含它们的文件。
换句话说,必须在文件至少有一行以下内容:
/*! \file */
或
/** @file */
这有一个使用结构化命令进行文档化的 C 头文件 structcmd.h:
/*! \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);
in body描述:可看成一个细节描述,或者是执行细节的集合。
int var; /*!< Detailed description after the member */
int var; /**< Detailed description after the member */
int var; //!< Detailed description after the member //!<
int var; ///< Detailed description after the member ///<
大多数时候也需要在一个成员之后,放置一个简明描述,如下:
int var; //!< Brief description after the member
int var; ///< Brief description after the member
函数中可用“@param”来文档化它的参数,使用“[in], [out], [in,out]”文档化它的执行方向。内联文档则可能从方向属性开始记录
void foo(int v /**< [in] docs for input parameter v. */);
注意“<”作为一个函数参数值是有效的。
/*! 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 */
};
Doxygen支持c风格注释、c++风格注释以及javaDoc风格注释等,下面将分别予以举例。
由于Doxygen支持 javadoc的格式,但还有部分区别,按照如下方式可以作为注释的模板,可以参考Doxygen的具体文档,形成你自己的风格。
JavaDoc 风格的注释风格主要使用下面这种样式: 即在注释块开始使用两个星号‘*‘
/**
* description
* description
* description
*/
Doxygen 支持的块(类、函数、结构体等)的注释描述分为两种:简述和详述,一般注释的描述由简述开始,经过特殊分隔方式后,后面紧跟详述的内容,javaDoc风格可以使用的分隔方法有以下两种:
使用\brief参数标识,空行作为简述和详述的间隔标识:
/** @brief Brief description.
* description continued.
*
* Detailed description starts here.
*/
直接使用javaDoc风格,javaDoc风格自动以简述开头,以空行(或者小数点加空格)作为简述与详述的分割
/** Brief description
* description continued . (注意:这里有一个小数点,加上一个空格)
* Detailed description starts here.
*/
文件的开头必须有文件注释,否则该文件不会被识别:
/** \file math.h */
/**
* @brief 说明内容
* @param void
* @return void
* @author 123
* @version v1.0.0.0
* @date 2013
* @since Keil uVision4
* @bug
* @warning
*/
/** 本类的功能:打印错误信息 * * 本类是一个单件 * 在程序中需要进行错误信息打印的地方 */ class CPrintError {
…… }
在成员变量上面加注释的格式
/** 成员变量描述 */int m_Var;
在成员变量后面加注释的格式
int m_color; /**< 颜色变量 */
/** 下面是一个含有两个参数的函数的注释说明(简述) * * 这里写该函数的详述信息 * @param a 被测试的变量(param描述参数) * @param s 指向描述测试信息的字符串 * @return 测试结果 (return描述返回值) * @see Test()(本函数参考其它的相关的函数,这里作一个链接) * @note (note描述需要注意的问题) */ int testMe(int a,const char *s);
/** 颜色的枚举定义
*
* 该枚举定义了系统中需要用到的颜色\n
* 可以使用该枚举作为系统中颜色的标识
*/
enum TEnum
{
RED, /**< 枚举,标识红色 */
BLUE, /**< 枚举,标志蓝色 */
YELLOW /**< 枚举,标志黄色. */
}enumVar;
/**
* 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 and returning 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);
};
C++的注释风格主要使用下面这种样式:即在注释块开始使用三个反斜杠‘/’其他地方其实与JavaDoc的风格类似,只是C++风格不用“*”罢了。
单行的///加一个空格开头的注释
,并写在该代码块声明的前面;至少两行的///加一个空格开头的注释
,若不足两行第二行的开头也要写出来,并且放在代码块定义的前面;如果某代码没有声明只有定义或者相反,则在定义或者声明前面写上单行的概述+一个空行+多行的详述
;在本行最后添加///加一个空格开头的注释
;单行///加一个空格开头的注释
(相当于是给改变量一个概述);/// @param+一个空格开头的行
描述在函数的详述里面;/// @return”+一个空格开头的行
描述在函数的详述里面;/// @see+一个空格开头的行
描述在函数的详述里面;C++风格的简述与详述方式与javaDoc类似。
一般注释的描述由简述开始,经过特殊分隔方式后,后面紧跟详述的内容,C++风格可以使用的分隔方法有以下两种:
使用\brief参数标识,空行作为简述和详述的间隔标识
/// \brief Brief description.
///
/// description continued.
///
/// Detailed description starts here.
///
使用以空行作为简述与详述的分割
/// Brief description /// /// description continued /// /// Detailed description starts here.
以小数点加空格作为分隔如下:
/// Brief description /// description continued . (注意:这里有一个小数点,加上一个空格) /// Detailed description starts here.
文件的开头必须有文件注释,否则该文件不会被识别:
/// \file math.h // @brief 说明内容// @param void/// @return void/// @author 123/// @version v1.0.0.0/// @date 2013/// @since Keil uVision4/// @bug /// @warning
/// 本类的功能:打印错误信息 /// /// 本类是一个单件 /// 在程序中需要进行错误信息打印的地方 class CPrintError { …… }
在成员变量上面加注释的格式
/// 成员变量描述 int m_Var;
在成员变量后面加注释的格式
int m_color; /// 颜色变量
/// 下面是一个含有两个参数的函数的注释说明(简述)
///
/// 这里写该函数的详述信息
/// @param a 被测试的变量(param描述参数)
/// @param s 指向描述测试信息的字符串
/// @return 测试结果 (return描述返回值)
/// @see Test() (本函数参考其它的相关的函数,这里作一个链接)
/// @note (note描述需要注意的问题)
int testMe(int a,const char *s);
/// 颜色的枚举定义
///
/// 该枚举定义了系统中需要用到的颜色
/// 可以使用该枚举作为系统中颜色的标识
enum TEnum
{
RED, ///< 枚举,标识红色
BLUE, ///< 枚举,标志蓝色
YELLOW ///< 枚举,标志黄色.
}enumVar;
//! 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 returning 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);
};
Python 文档化代码的标准方式,调用文档字串来完成。字串可以保存在__doc__
中,并能实时检索。Doxygen 能引用这些注释,并假定他们在预定义格式中可以被描述。
"""@package docstring
Documentation for this module.
More details.
"""
def func():
"""Documentation for a function.
More details.
"""
pass
class PyClass:
"""Documentation for a class.
More details.
"""
def __init__(self):
"""The constructor."""
self._memVar = 0;
def PyMethod(self):
"""Documentation for a method."""
pass
注意,在此模式下 doxygen 的特殊命令字是不支持的。
另一种文档化 Python 代码的方法使用“##”开始,这种注释块类型与其他 doxygen 支持语言的文档块比较一致, 在这种模式下允许使用特殊命令字 这是使用 doxygen 风格注释的同一个例子:
## @package pyexample
# Documentation for this module.
#
# More details.
## Documentation for a function.
#
# More details.
def func():
pass
## Documentation for a class.
#
# More details.
class PyClass:
## The constructor.
def __init__(self):
self._memVar = 0;
## Documentation for a method.
# @param self The object pointer.
def PyMethod(self):
pass
## A class variable.
classVar = 0;
## @var _memVar
# a member variable
因为 Python 看上去越来越象 Java 而不是 C/C++,所以需要设置OPTMIZE_OUTPUT_JAVA 为 YES。
VHDL 的注释通常从“–”开始,doxygen 的注释从“–!”开始。在 VHDL 中只有这两种注释类型,“–!”开头的注释表明它是一个简明描述,而一个多行“–!”开头(每一行开始都会有“–!”符号)的注释则表明它是一个细节描述。
注释总是处于将被文档化的文本行前端,并存在一个例外:端口的注释处于文本行的后端,并被当作端口的一个简明描述。
这有一个使用 doxygen 注释的 VHDL 文件的例子:
-------------------------------------------------------
--! @file
--! @brief 2:1 Mux using with-select
-------------------------------------------------------
--! Use standard library
library ieee;
--! Use logic elements
use ieee.std_logic_1164.all;
--! Mux entity brief description
--! Detailed description of this
--! mux design element.
entity mux_using_with is port (
din_0 : in std_logic; --! Mux first input
din_1 : in std_logic; --! Mux Second input
sel : in std_logic; --! Select input
mux_out : out std_logic --! Mux output
);
end entity;
--! @brief Architure definition of the MUX
--! @details More details about this mux element.
architecture behavior of mux_using_with is
begin
with (sel) select
mux_out <= din_0 when '0',
din_1 when others;
end architecture;
为获得合适的输出,需要设定 OPTIMIZE_OUTPUT_VHDL 为 YES,这个设置将会影响其他的一些设置。当他们没有被正确设定时,doxygen 也能发出一个警示,告知在哪里如何更改设置。
Doxygen 支持创建文本行列表的多种方法。
在每一行的开始处放置列对齐的多个减号“-
”,一个 bullet 列表将自动生成。使用“-
”紧跟“#
”,也能生成一个带编号的列表。
这有一个例子:
/*!
* A list of events:
* - mouse events
* -# mouse move event
* -# mouse click event\n
* More info about the click event.
* -# mouse double click event
* - keyboard events
* -# key down event
* -# key up event
*
* More text here.
*/
最终结果是:
A list of events:
● mouse events
a. mouse move event
b. mouse click event
More info about the click event.
c. mouse double click event
● keyboard events
a. key down event
b. key up event
More text here.
如果在列表中使用 tabs 进行缩排,请确认配置文件中 TAB_SIZE 选项是否设置了正确的 tab 尺寸。 可在列表结束的缩排层级的空白处放置一个点“.
”或者开始一个新的段落,即可结束一个列表。
这有一个不言自明的例子:
/**
* Text before the list
* - list item 1
* - sub item 1
* - sub sub item 1
* - sub sub item 2
* .
* The dot above ends the sub sub item list.
* More text for the first sub item
* .
* The dot above ends the first sub item.
* More text for the first list item
* - sub item 2
* - sub item 3
* - list item 2
* .
* More text in the same paragraph.
*
* More text in a new paragraph.
*/
如果你喜欢也可以在文档块中使用 HTML 命令。使用这些命令的优点在于,列表行中包含的多个段落看起来更自然。
这有一个运用 HTML 命令的例子:
/*!
* A list of events:
* <ul>
* <li> mouse events
* <ol>
* <li>mouse move event
* <li>mouse click event\n
* More info about the click event.
* <li>mouse double click event
* ol>
* <li> keyboard events
* <ol>
* <li>key down event
* <li>key up event
* ol>
* ul>
* More text here.
*/
注意:在 HTML 模式下缩排的层级并不重要。
为兼容 QT 的内部文档工具 qdoc 和 kDoc,doxygen 有两个可用于创建简单的无嵌套列表的命令。
Doxygen 一共有三种组合的机制
进行设计时,通常有模块的概念,**一个模块可能有多个类或者函数组成,完成某个特定功能的代码的集合。 **如何对这个概念进行注释?doxygen提供了group
的概念,生成的模块的注释会单独放在一个模块的页面中。
模块是在一个独立页面中进行组合的方法,你可以文档化整个组以及所有单独的成员,一个组的成员可以是文件,名字空间,类,函数,变量,枚举,类型转换以及定义,但也可以是其他的组。
定义一个组,你需要在特殊注释块中放置\defgroup
或@ defgroup
命令,\
和@
等同。命令的第一个参数是一个组的 uid
(uniquely identify唯一表示)label,第二个参数是将出现在文档中的组的名称或标题。
在组之前使用打开标记“@{
”,或在组之后使用关闭标记“@}
”,将每一个成员组合在一起,并在文档中避免放 置\ingroup
命令。这些标记可放置在组定义的文档或一个独立的文档块中。
使用下面的格式定义一个group
/**
* \defgroup [A] [brief group description ]
*/
/*@{*/
/** a variable in group A */
int VarInA;
/*@}*/
group中的代码可以有自己的注释。
单纯定义一个模块,去除{ 和}命令即可。
对这种组进行命名可以使用name命令。此时中间代码可以有自己的注释。如:
/** @name group_name
* description for group.
*/
//@{
code…
//@}
\ref
命令定义组的引用名称,第一个参数\ref
命令将用到组 label
,如果要用自定义链接名称,可在 label
之 后可放置使用双引号修饰的链接名称,如下面的例子所示:
This is the \ref group_label "link" to this group.
任何其他代码项(比如类、函数、组甚至文件)如果要加入到某个模块,可以在其doxygen注释中使用ingroup
命令即可。
/**
* \ingroup A
*/
extern int VarInA;
Group之间使用ingroup
命令,可以组成树状关系。
/**@file util.cpp
* @ingroup [group_name]
* @brief files brief info.
*/
把多个代码项一起添加到某个模块中可以使用addtogroup
命令,格式和defgroup
相似。
组可以使用自身的组标记实现嵌套。 当使用相同的组 label 超过一次,你将得到一个错误消息。
如果你不希望 doxygen 强制组 label 的唯一性,可用\addtogroup
替换掉\defgroup
,当组已经被定义,它可以合并到一个已经存在的文档中,形成一个新组。组标题 对于这个命令来说是可选的。所以你可以使用
/** \addtogroup
/*\@{*/
/*\@}*/
注意:
复合体(比如类,文件,名字空间)可放到多个组中
成员(比如变量,函数,类型转换,枚举)只能是一个组中的组成员(这种位置上的限制,是为了当一个成员在它的类,名字空间,文件的正文中无法被文档化而在组中却是可见的情况下,避免链接组目标时产生二义性 )
Doxygen 放置组成员时,会将其定义为最高的“优先级”:
例如一个直接\ingroup
命令可通过“@{ @}
”覆盖掉一个意义含混的组定义。相同优先级下的组定义冲突将触发一个警告,除非一个成员定义并未出现在其他直接的文档中。
以下的例子是放置 VarInA 到组中,解决 IntegerVariable 放置IntVariables 组的冲突,因为 extern int IntegerVariable 无法不被文档化的:
/**
* \ingroup A
*/
extern int VarInA;
/**
* \defgroup IntVariables Global integer variables
*/
/*@{*/
/** an integer variable */
extern int IntegerVariable;
/*@}*/
....
/**
* \defgroup Variables Global variables
*/
/*@{*/
/** a variable in group A */
int VarInA;
int IntegerVariable;
/*@}*/
组定义的优先级(从最高到最低):\ingroup,\defgroup,\addtogroup,\weakgroup
。最后的命令\addtogroup
想比有一个更低的优先级(?),但\weakgroup 允许你添加“松散”的组定义:你能在.h 文件中使用更高级别的命令来定义层次结构,而在.c 文件中的\weakgroup 无须完全复制这种层次结构。
例子:
/** @defgroup group1 The First Group
* This is the first group
* @{
*/
/** @brief class C1 in group 1 */
class C1 {
};
/** @brief class C2 in group 1 */
class C2 {
};
/** function in group 1 */
void func() {
}
/** @} */ // end of group1
/**
* @defgroup group2 The Second Group
* This is the second group
*/
/** @defgroup group3 The Third Group
* This is the third group
*/
/** @defgroup group4 The Fourth Group
* @ingroup group3
* Group 4 is a subgroup of group 3 */
/**
* @ingroup group2
* @brief class C3 in group 2
*/
class C3 {
};
/** @ingroup group2
* @brief class C4 in group 2
*/
class C4 {
};
/** @ingroup group3
* @brief class C5 in @link group3 the third group@endlink.
*/
class C5 {
};
/** @ingroup group1 group2 group3 group4
* namespace N1 is in four groups
* @sa @link group1 The first group@endlink, group2, group3, group4
*
* Also see @ref mypage2
*/
namespace N1 {
};
/** @file
* @ingroup group3
* @brief this file in group 3
*/
/** @defgroup group5 The Fifth Group
* This is the fifth group
* @{
*/
/** @page mypage1 This is a section in group 5
* Text of the first section
*/
/** @page mypage2 This is another section in group 5
* Text of the second section
*/
/** @} */ // end of group5
/** @addtogroup group1
*
* More documentation for the first group.
* @{
*/
/** another function in group 1 */
void func2() {
}
/** yet another function in group 1 */
void func3() {
}
/** @} */ // end of group1
如果一个复合体(比如一个类或文件)有很多成员,通常希望能将成员们一同合并到组中,doxygen 在类型 和保护层级之上,已经能够自动组合, 但是你也许感觉有这些还不够或是认为缺省的组合操作将会出错,例如 你觉得存在类型差异(语法的)的成员属于相同(语义上的)的组。
如果你喜欢 C 风格注释,用以下两种块模板来定义一个成员组,注意成员组内部的组成员都必须是确实存在。
//@{
...
//@}
或
/*@{*/
...
/*@}*/
在一个块开始标记“@{”之前可以放置一个单独的注释块,而此块必须包含@name (或 \name)命令,用于指定组的头部,也可选择让注释块包含更多的组信息。
*** *对于某几个功能类似的代码项(比如类、函数、变量)等,如果希望一起添加注释,而又不想提升到模块的概念, ****可以通过下面的方式:
//@{
/** Comments for all below code. */
code…
//@}
成员组的嵌套是不被允许的。
如果一个类的成员组中的全部组成员都有相同的类型和保护级别(比如全是静态公有成员),那么整个成员组被当成类型/保护级别组的一个子分组(例如成员组将被看\“静态公有成员\”节点的子节点),假如两个或多个成员有不同的类型,那么组会将它们置于相同的层级上自动生成一个组,假如你希望强制类的全部组成员在顶层,你需要在类文档中加入\nosubgrouping 命令。
例子:
/** A class. Details */
class Test
{
public:
//@{
/** Same documentation for both members. Details */
void func1InGroup1();
void func2InGroup1();
//@}
/** Function without group. Details. */
void ungroupedFunction();
void func1InGroup2();
protected:
void func2InGroup2();
};
void Test::func1InGroup1() {
}
void Test::func2InGroup1() {
}
/** @name Group2
* Description of group 2.
*/
//@{
/** Function 2 in group 2. Details. */
void Test::func2InGroup2() {
}
/** Function 1 in group 2. Details. */
void Test::func1InGroup2() {
}
//@}
/*! \file
* docs for this file
*/
//@{
//! one description for all members of this group
//! (because DISTRIBUTE_GROUP_DOC is YES in the config file)
\#define A 1
\#define B 2
void glob_func();
//@}
Group1 看成公有成员的子节点,而 Group2 则是一个独立节点,因为它包含成员中存在不同保护级别(即公有和保护)。
信息可用\page 和\mainpage 命令合并到页面中,正常情况下,结果将置于页面的平直(无缩排)列表中,列表的起始端即为\“主\”页面。
在“模块”章节中简述添加结构的替代方法,为了更自然和方便地增加额外结构到页面中,可以使用\subpage命令。
A 页面用\subpage 命令增加一个链接到 B 页面,同时将 B 页面变成 A 页面的一个子页。这对于 GA,GB 两个组同 样有影响,使得 GB 变为 GA 一部分的方法,将 A 页面置于 GA 组内,而将 B 页面置于 GB 组内即可。
Doxygen 允许你放置 Latex 公式在输出中(只能支持 HTML,Latex 的输出,无法用于 RTF 和 man 页面输出),在 HTML 文档中可以包含公式(可看成图片),你需要安装以下工具:
在文档中包含公式的若干方法:
在运行的文本中使用文本公式,这些公式可以放置在一对 \f$ 命令之间,如:
The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is \f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$.
结果为:
集中于单独一行的非数字公式,这些公式可放置在 \f[ 和 \f]命令之间,一个例子:
\f[
|I_2|=\left| \int_{0}^T \psi(t)
\left\{
u(a,t)-
\int_{\gamma(t)}^a
\frac{d\theta}{k(\theta,t)}
\int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi
\right\} dt
\right|
\f]
结果为:
Latex 元件可用\f{environment}命令说明, environment 是 Latex 所支持的environment 名称,配合\f}终止命令,这有一个等式计算的例子:
\f{eqnarray*}{
g &=& \frac{Gm_2}{r^2} \\
&=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
\mbox{s}^{-2})(5.9736 \times
10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
&=& 9.82066032\,\mbox{m/s}^2
\f}
结果为:
前两个命令都能确定公式包含有 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLbJVs39-1631945542641)(Qt5.12.6+Doxygen生成chm开发手册教程.assets/image-20210616154519974.jpg)]数学模式下的有效命令,第三个命令包含特殊环境下的有效命令。
警告:
当前 doxygen 的公式从错误中自动修正的容错能力,还不能令人满意。它可能会成功删除已写入 html 目 录的 formula.repository 文件,以丢弃一个出错的公式。
提供三种方式:
Wizard方式指简约方式:在其中只提供一些重要的参数设置,其余的均为默认值;
Expert方式为详细方式:通过该选项可以详细地配置Doxygen的各个配置项;
Doxyfile Load方式:用于导入以前生成的Doxyfile配置文件,导入后可以再点击Expert进行修改。
开始–>所有程序–>Doxygen–>doxywizard
工作目录如下:
.
├── out
└── src
└── math.h
/*! \file math.h 中的一个函数*/
/*!
用于求一个角度的sin值,输入是字符串以便同时支持弧度制和角度制表示
\li 弧度制用pi表示,例如:2pi表示一圈、0.5pi表示直角
\li 角度制用d结尾,例如:360d表示一圈、90d表示直角
\li 输入也可以是数值,例如:输入3.14159大约表示180度
\param a 用弧度制或角度制表示都行,字符串必须用'\0'表示结束
\param[out] res 是输出参数,用于保存sin运算的结果
\return 错误码,0表示成功,其它表示失败
\todo 在xxx的情况下存在BUG,预计下一版本修复
*/
int sin(char *a, double *res);
这里我们只填入必要的配置,其它配置都用默认值。
文档位置在之前的out目录下。
Doxygen输出的默认HTML比较难看,如图
Doxygen默认的页面主色调大约是天蓝色的。
Doxygen中「导航栏」有两种展示方式:Treeview和Index,分别是竖向和横向的
可以配置DISABLE_INDEX
和GENERATE_TREEVIEW
来控制是否显示它们,如图。
Step 1:Specify the working directory from which doxygen will run
:步骤1:指定运行 doxygen 的工作目录
Step 2: Configure doxygen using the Wizard and/or Expert tab,then switch to the Run tab to generate the documenting
步骤 2:使用向导和/或专家选项卡配置 doxygen,然后切换到运行选项卡以生成文档
名称说明:
Project name :项目名称,将在最新的文档首页中显示
Project synopsis:项目概要
Project version or id:项目版本和ID
Project logo:项目图标
Source code directory: 源码目录,选择要生成文档的源代码或目录,可以有多个文件或目录形成一个列表。(建议使用相对路径,相对当前配置文件所在的目录)
Scan recursively :递归扫描*,*如果需要对整个源码目录下的所有子目录及文件生成文档,请勾选本项。
Destination directory:输出目录:设置最终生成的帮助文档的存储路径,建议使用相对路径
示例:
名称说明:
select the desired extraction mode
:选择所需的提取模式
Documented entities only:只生成文档
All Entities:所有实体,图片、html等,可以输出相对完整的功能。
Include cross-referenced source code in the output:是否包含源代码看你自身情况
select programming language to optimize the results for
:选择被注释的编程语言以优化结果
Optimize for C++ output:优化C++语言的注释
Optimize for C++ /CLI output:优化 C++ /CLI 语言的注释
Optimize for Java/C# output:优化Java/C#语言的注释
Optimize for C++/PHP output:优化C++/PHP语言的注释
Optimize for Fortran output:优化Fortran语言的注释
Optimize for VHDL output:优化VHDL语言的注释
示例:
如果你需要输出chm格式,请在Output中勾选。
名称说明:
select the output format to generate
:选择要生成的输出格式
HTML:html格式
Plain HTML:优化HTML
With navigation panel:带有导航窗格
***prepare for compressed HTML(.chm)***:准备压缩的HTML
With search function:具有搜索功能
Change color…:调整html页面的外观风格
LaTeX:数学公式
Man pages:主页
Rich Text Format(RTF):富文本格式
XML:xml格式
示例:
在Diagrams中可以选择使用GraphViz插件包,来将代码结构输出UML图.
名称说明:
Diagrams to generate
:生成图片
No diagrams:无图表
Use built-in class diagram generator:使用内置的类图生成器
Use dot tool from the GraphViz package:使用GraphViz软件包中的点工具
dot graphs to generate
点图生成
class diagrams:类图
collaboration diagrams:协作图
overall class hierarcy graphs:整体类层次图
include dependency graphs:包括依赖图
included by dependency graphs:依赖图包含
call graphs:调用图
called by graphs:由图调用
示例:
所有高级设置(包括编码设置)都在“Expert”标签
名称说明:
DOXYFILE_ENCODING:当前 Doxygen 配置文件本身的字符编码,默认为UTF-8,一般不需要修改
**OUTPUT_LANGUAGE&:输出语言。这里是指Doxygen自己生成的导航、提示、帮助等文本的文字采用的语言。我们希望帮助文档是全中文的,所以选择Chinese
示例:
名称说明:
EXTRACT_PACKAGE:提取包
EXTRACT_ALL :输出所有的函数,但是private和static函数不属于其管制。
EXTRACT_PRIVATE :输出private函数。
EXTRACT_STATIC :输出static函数。同时还有几个EXTRACT,相应查看文档即可。
HIDE_UNDOC_MEMBERS 表示:那些没有使用doxygen格式描述的文档(函数或类等)就不显示了。当然,如果EXTRACT_ALL被启用,那么这个标志其实是被忽略的。
INTERNAL_DOCS 主要指:是否输出注解中的@internal部分。如果没有被启动,那么注解中所有的@internal部分都将在目标帮助中不可见。
CASE_SENSE_NAMES 表示:是否关注大小写名称,注意,如果开启了,那么所有的名称都将被小写。对于C/C++这种字母相关的语言来说,建议永远不要开启。
HIDE_SCOPE_NAMES 表示:域隐藏,建议永远不要开启。
SHOW_INCLUDE_FILES 表示:是否显示包含文件,如果开启,帮助中会专门生成一个页面,里面包含所有包含文件的列表。
INLINE_INFO :如果开启,那么在帮助文档中,inline前面添加inline。
SORT_MEMBER_DOCS :如果开启,那么在帮助文档列表显示的时候,函数名称会排序,否则按照解释的顺序显示。
GENERATE_TODOLIST :是否生成TODOLIST页面,如果开启,那么包含在@todo注解中的内容将会单独生成并显示在一个页面中,其他的GENERATE选项同。
SHOW_USED_FILES :是否在函数或类等的帮助中,最下面显示函数或类的来源文件。
SHOW_FILES :是否显示文件列表页面,如果开启,那么帮助中会存在一个一个文件列表索引页面。
示例:
无手动修改
INPUT_ENCODING:输入文件的编码,指我们的源代码文件本身的编码。在Windows平台一般是系统编码(GBK),而Linux平台一般是UTF-8。请用文本编辑器查看源文件的编码。这里如果设置的不一致,源码文件的注释中所有非ASCII字符将在生成的文档中变成乱码。
无手动修改
无手动修改
名称说明:
GENERATE_HTMLHELP:确保已经勾选了
CHM_FILE:最终生成的.chm的文件名,默认为“index.chm”.如“HkcProj。ctHelp.chm”,方便寻找。可以使用路径,也可以使用相对路径,相对于上面设置的输出目录的html目录(建设使用上一级目录,如“…\MyDoc.chm”)
HHC_LOCATION:chm 编译器(hhc.exe)的全路径。请指到 HTML Help Workshop 的安装目录的 hhc.exe 程序 。
CHM_INDEX_ENCODING*:*这里设置Doxygen生成的CHM索引文件的编码,以前是不能设置的,默认为UTF-8,而微软的编译器不能识别UTF-8编码的索引文件,所以最终造成左边目录导航栏乱码。我们设置它为GBK,这样Doxygen将为我们生成GBK编码的索引文件(.hhc、.hhk、.hhp)
示例:
无手动修改
无手动修改
无手动修改
无手动修改
无手动修改
无手动修改
无手动修改
无手动修改
无手动修改
无手动修改
在Expert的Dot中勾选CLASS_DIAGRAMS,UML_LOOK
CLASS_DIAGRAMS:类图表
UML_LOOK:uml视图,根据需求。
DOT_IMAGE_FORMAT:为了减少chm体积,在中选择gif或者jpg,均可。
DOT_PATH:下面填入graphiv的bin目录绝对路径。
点击Run doxygen
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pJyUlFGu-1631945542650)(https://ossimg.weixinzeng.cn/%E5%8D%9A%E5%AE%A2%E5%9B%BE%E7%89%87/Typora%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/20210619145539.jpg)]
点击Show HTML output
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SSurUCDI-1631945542651)(https://ossimg.weixinzeng.cn/%E5%8D%9A%E5%AE%A2%E5%9B%BE%E7%89%87/Typora%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/20210619145607.jpg)]
生成的参考手册网页版,在目标目录下会生成一个文件夹,如果生成成功会找到一个xxx.chm文件。
配置文件是一个开放的 ASCII 文本文件,且包含一个类似于 Makefile 的文件结构,它的默认名称是 doxyfile,并能被 doxygen 解析。
这个文件可以包含若干的制表符和换行符,用于格式化的目的。
文件中语句对大小写敏感,能在文件的任何位置放置注释(除了引号之间)。从“#”字符开始的一行内容将被当成注释。
格式:该文件主要包括一个赋值语句列表,每条语句的首部都包括一个TAG_NAME,并跟随一个“=”符号,以及一个或多个值。
赋值:如果同一个选项被多次赋值,那么最后的赋值将覆盖掉之前的。
参数列表:对于能附带参数列表的选项,可以使用“+=”操作符来替代“=”,它能将新值添加到参数列表中,而其中的值是一个无空格的连接序列,如果这些值包含一个或多个空格,它必须使用引号(“…”)。
连接多个行:在一行的最后一个字符后插入一个反斜杠“\”,可将多个行连接在一起。
环境变量使用$(ENV_VARIABLE_NAME)来扩展。
你也能使用@INCLUDE 标记包含其他的配置文件,如下:
@INCLUDE = config_file_name Doxygen 将会在当前工作目录下搜索被包含的配置文件,你也能指定一个目录列表,用于在查找当前工作目录之前进行配置文件的搜索。在@INCLUDE 标记之前放置一个@INCLUDE_PATH 标记,如: @INCLUDE_PATH = my_config_dir
假定你已有了一个包含两个文件的简单项目:一个 example.cc 源文件和一个 example.h 头文件,以及一个同样
简单的最小配置文件:
INPUT = example.cc example.h
假定例子使用 Qt 类,perl 位于/usr/bin,一个更实用的配置文件,如下:
PROJECT_NAME = Example
INPUT = example.cc example.h
WARNINGS = YES
TAGFILES = qt.tag
PERL_PATH = /usr/bin/perl
SEARCHENGINE = NO
以下是为生成 QdbtTabular程序包文档所用的配置文件:
参考
PROJECT_NAME = QdbtTabular OUTPUT_DIRECTORY = htmlWARNINGS = YES INPUT = examples/examples.doc src FILE_PATTERNS = *.cc *.h INCLUDE_PATH = examples TAGFILES = qt.tag PERL_PATH = /usr/local/bin/perlSEARCHENGINE = YES
以下是为重新生成 Qt-1.44 源码文档所用的配置文件:
PROJECT_NAME = Qt OUTPUT_DIRECTORY = qt_docs HIDE_UNDOC_MEMBERS = YES HIDE_UNDOC_CLASSES = YES ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES SEARCH_INCLUDES = YES FULL_PATH_NAMES = YES STRIP_FROM_PATH = $(QTDIR)/PREDEFINED = USE_TEMPLATECLASS Q_EXPORT= \ QArrayT:=QArray \ QListT:=QList \ QDictT:=QDict \ QQueueT:=QQueue \ QVectorT:=QVector \ QPtrDictT:=QPtrDict \ QIntDictT:=QIntDict \ QStackT:=QStack \ QDictIteratorT:=QDictIterator \ QListIteratorT:=QListIterator \ QCacheT:=QCache \ QCacheIteratorT:=QCacheIterator \ QIntCacheT:=QIntCache \ QIntCacheIteratorT:=QIntCacheIterator \ QIntDictIteratorT:=QIntDictIterator \ QPtrDictIteratorT:=QPtrDictIterator INPUT = $(QTDIR)/doc \ $(QTDIR)/src/widgets \ $(QTDIR)/src/kernel \ $(QTDIR)/src/dialogs \ $(QTDIR)/src/tools FILE_PATTERNS = *.cpp *.h q*.doc INCLUDE_PATH = $(QTDIR)/include RECURSIVE = YES
以下是用于 Qt-2.1 的推荐设置: PROJECT_NAME = Qt
PROJECT_NUMBER = 2.1HIDE_UNDOC_MEMBERS = YES HIDE_UNDOC_CLASSES = YES SOURCE_BROWSER = YES INPUT = $(QTDIR)/src FILE_PATTERNS = *.cpp *.h q*.doc RECURSIVE = YES EXCLUDE_PATTERNS = *codec.cpp moc_* */compat/* */3rdparty/*ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 3 IGNORE_PREFIX = Q ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES INCLUDE_PATH = $(QTDIR)/include PREDEFINED = Q_PROPERTY(x)= \ Q_OVERRIDE(x)= \ Q_EXPORT= \ Q_ENUMS(x)= \ "QT_STATIC_CONST=static const " \ _WS_X11_ \ INCLUDE_MENUITEM_DEFEXPAND_ONLY_PREDEF = YES EXPAND_AS_DEFINED = Q_OBJECT_FAKE Q_OBJECT ACTIVATE_SIGNAL_WITH_PARAM \ Q_VARIANT_AS
doxygen 预处理可代用通常情况下的 C 预处理器,但无法实现宏的完全展开。
如果我们希望下次代码改动后能够继续沿用上次配置,那么我们可以把上面两种方式的配置保存成Doxyfile文件。
文件名符合FILE_PATTERNS都会被处理。
其中包括了.c、.h、.py等等
如果我们的扩展名并不在FILE_PATTERNS内,那么可以加上去。例如我们项目下的所有.ccc文件,其实是C语言代码(这很奇葩,举个例子而已)。那我们可以编辑Doxyfile配置文件满足这一需求,需要2个步骤。
在EXTENSION_MAPPING中添加映射规则ccc=C,如图3-3。语法是ext=language,其中language可以取的值有:IDL、Java、Javascript、C#、C、C++、D、PHP、Objective-C、Python、Fortran、VHDL。
如果嫌生成的HTML不好看,可以自定义HTML页面头部、尾部以及页面整体CSS样式表。
配置HTML_HEADER、HTML_FOOTER、HTML_STYLESHEET指向修改后的文件,如图。
可以通过HTML_COLORSTYLE_HUE、HTML_COLORSTYLE_SAT、HTML_COLORSTYLE_GAMMA修改主色调,这3个配置分别对应色相、饱和度、Gamma校正,见图。如果不太懂色相、饱和度是啥意思,请自行百度「色彩模式」或参考Photoshop相关教程。
我们已经知道Doxygen中「导航栏」有Treeview和Index两种了。这节介绍如何定制导航栏的目录结构。这需要三个步骤。
编辑DoxygenLayout.xml文件,修改其中的布局
修改LAYOUT_FILE配置,使其指向DoxygenLayout.xml文件,如图
运行Doxygen
那么如何修改XML文件呢?默认的DoxygenLayout.xml代码如下:
<doxygenlayout version="1.0"> <navindex> <tab type="mainpage" visible="yes" title=""/> <tab type="pages" visible="yes" title="" intro=""/> <tab type="modules" visible="yes" title="" intro=""/> <tab type="namespaces" visible="yes" title=""> <tab type="namespacelist" visible="yes" title="" intro=""/> <tab type="namespacemembers" visible="yes" title="" intro=""/> tab> <tab type="classes" visible="yes" title=""> <tab type="classlist" visible="yes" title="" intro=""/> <tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/> <tab type="hierarchy" visible="yes" title="" intro=""/> <tab type="classmembers" visible="yes" title="" intro=""/> tab> <tab type="files" visible="yes" title=""> <tab type="filelist" visible="yes" title="" intro=""/> <tab type="globals" visible="yes" title="" intro=""/> tab> <tab type="examples" visible="yes" title="" intro=""/> navindex> doxygenlayout>
XML对应了导航栏的目录树结构,我们通过该文件改变布局。标签的type属性取值除了上面列出的这些预定义值以外,还可以是type="user"或type=“usergroup”,我们只能通过这两个type自定义布局,例如下面这段代码,生成的效果如图
<doxygenlayout version="1.0"> <navindex> <tab type="usergroup" visible="yes" title="友情链接(演示如何外链)"> <tab type="user" visible="yes" title="百度" url="http://www.baidu.com" /> <tab type="user" visible="yes" title="163" url="http://www.163.com" /> tab> <tab type="usergroup" visible="yes" title="数学库(演示如何链接文件)"> <tab type="user" visible="yes" url="@ref math.h" title="math" /> <tab type="user" visible="yes" url="@ref math2.h" title="math2" /> tab> <tab type="usergroup" visible="yes" title="三角函数(演示链接函数、结构体)"> <tab type="user" visible="yes" url="@ref sin" title="sin" /> <tab type="user" visible="yes" url="@ref sin2" title="sin2" /> tab> navindex> doxygenlayout>
如果Doxygen输出的界面实在不入你的法眼,以上介绍的定制化功能也不能彻底满足你的需求。那么你需要根据Doxygen输出的XML数据自行生成界面了。
注意在默认情况下,CHM会有一个CHI文件,似乎是用来加速索引的。我本人也遇到过很多用户仅仅上传了CHM,**而没有上传CHI文件,导致无法正常显示的情况。我不知道是否可以通过工具重建CHI文件,但是我觉得关闭这个功能即可。 **
打开[Expert…]的HTML页面,取消GENERATE_CHI即可。
小故事:我可以用Doxygen生成一个CHM文件。启动CHM文件,我发现内容和索引选项卡确实列出了这些类的页面,名称空间,类和成员。但是,单击这些内容和索引列表中的项目不会显示任何内容。如何使用Doxygen和HTML帮助编译器生成CHM?
我在使用Windows 7 Professional SP1(64位)的计算机上。
我使用Doxywizard在我的代码上运行Doxygen版本1.8.9.1。它正确地生成HTML输出;页面,命名空间,类和成员出现在文档中。
然后我又想将HTML转换成压缩的HTML(CHM)文件。
我从Microsoft网站下载了Microsoft HTML Help Workshop 1.31版(即htmlhelp.exe版本4.74.8703)。我运行了安装程序。当安装程序正在进行时,出现弹出消息:
This computer already has a newer version of HTML Help.
但是,安装已成功完成。而且,hhc.exe程序就在那里,我告诉它安装。
我现在指定这些相关Doxygen的设置:
向导 - >输出:
HTML检查
“压缩HTML(的.chm)准备” 选项被选中。
专家 - > HTML:
GENERATE_HTMLHELP = YES
CHM_FILE = Foo.chm
HHC_LOCATION = C:\ Program Files文件(x86)的\微软\的HTML Help Workshop的\ hhc.exe
当我再次运行Doxygen的,它会报告错误:
error: failed to run html help compiler on index.hhp
在预期的位置生成Foo.chm文件。但是,如上所述,它缺少很多内容。
我试着在Doxygen生成的HHP文件上手动运行hhc.exe。它不表示任何错误。
C:\Program Files (x86)\Microsoft\HTML Help Workshop>hhc c:\test\html\index.hhp
Microsoft HTML Help Compiler 4.74.8702
Compiling c:\test\html\Foo.chm
Compile time: 0 minutes, 3 seconds 292 Topics 3,855 Local links 83 Internet links 0 Graphics
Created c:\test\html\Foo.chm, 259,580 bytes
Compression decreased file by 1,077,915 bytes.
然而,结果是一样的:一个Foo.chm文件缺少内容。
我后来发现我在我的电脑上安装了另一个HTML Help Workshop。但是,hhc.exe是完全相同的版本。所以,这可能不是问题。
你能否建议我还可以尝试获取所有文档内容以显示在CHM文件中?
参考
回答
当我看到这个问题(html存在和chm有内容但内容不可见)时,这是因为Windows安全已经“阻止”了chm文件。要查看这是你遇到的问题,请尝试以下操作:
在Windows资源管理器中,右键单击生成的.chm文件并选择属性。
在“常规”选项卡上,如果看到“解除阻止”按钮,请单击它。
关闭对话框并打开.chm文件。
(我还没有遇到这个问题,doxygen的.chm文件本地产生的,但我从你的描述希望,这可能会解决你的问题。)
我没有看到“阻止”按钮点击。但是,这让我想到了正确的道路。我已经简化了我的上述问题描述,说“Foo.chm”文件在’c:'驱动器上。但是,它实际上位于映射的网络驱动器上。当我将CHM文件复制到计算机上的物理驱动器时,显示的所有内容。问题解决了。谢谢。
DoxyGen的实现中大概有三处编码的设置。
首先是,doxyfile,也就是配置文件。
其次,INPUT_ENCODING,也就是DoxyGen需要解析的输入文件的编码*
最后,**就是输出的编码。**譬如CHM左边的索引编码。
首先是chm的标题乱码,这个比较好解决,因为DoxyWizard使用QT做的界面,它内部做了转换,所以在DoxyWizard中输入中文,在保存的时候,他自己做了转码,导致doxyfile中的最终的保存信息不正确。这个时候只需要用记事本打开doxyfile配置文件,输入相应中文即可。注意保存的时候保存成ANSI编码即可。保存成其他格式的话可能需要去掉BOM,比较麻烦,没研究了。这个相应的编码设置在[Expert…]中,页Project 的 DOXYFILE_ENCODING,不输入或者默认为UTF-8都行。
其次是右边内容乱码,这个多半是因为你没有配置好输入的文件编码类型造成的。
在[Expert…]的Input页面中,有一个INPUT_ENCODING,这个选项表示输入文件的编码方式,这要和你处理的源文件格式一致。对于我们来说(使用vs的人),一般设置为GB2312。当然,再次声明,编码方式取决于源文件的编码方式。如果文件编码已经是UTF-8了,然而你还将其设置成GB2312,那么DoxyGen会将UTF-8当成ANSI再进行一次UTF-8转换,自然会出错了。
最后也是经常遇到的问题就是DoxyGen生成的CHM文件的左边树目录的中文变成了乱码。
这个只需要将chm索引的编码类型修改为GB2312即可。在HTML的CHM_INDEX_ENCODING中输入GB2312即可。然而这种方法下,还有一个瑕疵之处,就是chm的搜索页的搜索结果中显示的中文文字却变成乱码了*。这是因为DoxyGen默认开启了HTML Help Workshop的Full-textsearch全文搜索选项,他在进行全文搜索的时候,应该是打开文件然后按照ANSI进行搜索的,(资料表示HHW不支持UTF-8,仅支持ISO-8859-1或者windows-1252编码。)而Doxygen生成的右边界面统一是UTF-8,这自然出现了问题。而在这种情况下做全文搜索,理论上只能搜索英文。
无奈,我们的解决方案只能是**重新编译DoxyGen代码,为了满足搜索,只要保证右边的页面文件不是UTF-8即可。我们首先修改writeDefaultHeaderFile这个函数的代码,将其charset=GB2312。然后在TranslatorDecoder的构造函数中修改m_toUtf8 =(void )-1;即屏蔽文本写入时最终的转换函数。**最后删除INPUT_ENCODING的设置或者输入UTF-8。**这样会使DoxyGen认为我们的文本是UTF-8的,从而不用进行转换。生成替换原始的DoxyGen即可。
另外需要补充的是,还有一种方案是不用修改作者的源代码,但是需要将DoxyGen生成的右边的HTML文件使用工具(如iconv)手工转换成GB2312,然后再使用HTML Help Workshop生成,网上有篇文章介绍过,我测试一下,也是没有问题的。
最后,doxygen是一个开源项目,并且支持vs2005项目,这样一来,如果你觉得哪里不顺手,完全可以把代码下载后自行编译。虽然我感觉doxygen的代码写的不能算是perfect,但是对于一个这样的工程,我们无论如何都需要一种敬意。祝好运~
这样,基本上就能够用doxygen生成漂亮的文档了。代码方面,doxygen支持多种格式的注释风格,根据manual选择自己喜欢的就好。
首先确保安装了graphviz forwin,注意不是wingraphviz,后者是一个graphviz的com封装,但是doxygen并不是基于它开发的,所以装了也没用。
然后在expert的DOT_PATH中填入graphviz的安装路径。接着在wizard的diagram中选择需要生成的图形类别就可以了。
如果出现无法包含.map文件的错误,可以将工作目录设置成html,并将html中所有文件都清除再试。这个问题的原因还不太确定。
这个问题其实比较棘手,在[Expert…]中的Project页面,下面有一个选项叫做SEPARATE_MEMBER_PAGES,把这个选项选中,这样每个函数就是一个页。但是会有一个问题,那就是右边页面的旁边多了所有函数的列表**。很遗憾,经过研究,这个确实无法去掉。**
我的解决方法就是自己编译一下doxygen,在memberlist.cpp的writeDocumentationPage函数中将container->writeQuickMemberLinks(ol,md);连同附近几行屏蔽掉即可
打开[Expert…]的HTML页面,然后选中TOC_EXPAND即可。
打开[Expert…]的HTML页面,然后在HTML_FOOTER中指定相应的HTML文件即可。注意HTML_FOOTER中至少包含BODY和HTML结束标记。即一个最小的尾部HTML至少是这样
BODY>HTML>
同理,如果你要指定了HTML_HEADER,他至少包含
<HTML><HEAD>HEAD><BODY>
组就是可以把同类的函数放到一个根下的显示方式。doxygen支持grouping,即你可以把相关的代码通过标志,放到同一个组中,便于查看。这主要是通过几个内置语法命令。首先通过@defgroup定义一个组,然后要把分组的函数或者类等,通过标志@ingroup加入相应的组。这样,相应的函数就被放置在同一个组中。
这个功能就是在chm的左边树中直接列出函数列表,而不用点击看右边页面了。**这个功能需要修改源代码。在index.cpp中,屏蔽writeGroupIndexItem函数的Doxygen::indexList.addContentsItem,Doxygen::indexList.incContentsDepth和Doxygen::indexList.decContentsDepth();即可,具体不解释了,一看便知 **。
这对我来说很有用,可以隐藏大块的代码和文档:
/*! \cond PRIVATE */
/*! \endcond */
注意:留一个空行,否则类的生成会丢失
使用ENABLED_SECTIONS = PRIVATE
运行以创建文档的内部版本。
您可以有多个条件,并根据受众启用/禁用它们。
要隐藏文档块的一部分,请使用\internal
(除非找到\endinternal
,否则将隐藏到块结束)
注意:如果您不喜欢反斜杠,可以使用@表示法。
Doxygen手册提供了一些可能性: HIDE_UNDOC_MEMBERS,HIDE_UNDOC_CLASSES:显然只有在您只记录公共成员时才有效。 INTERNAL_DOCS:允许您使用\ internal标记从文档的“公共”版本中排除注释。 ENABLED_SECTIONS:是INTERNAL_DOCS的更通用版本
可以在注释中加一些Doxygen支持的指令,主要作用是控制输出文档的排版格式,使用这些指令时需要在前面加上“\”或者“@”(JavaDoc风格)符号,告诉Doxygen这些是一些特殊的指令,通过加入这些指令以及配备相应的文字,可以生成更加丰富的文档,下面对比较常用的指令做一下简单介绍。
名称 | 含义 |
---|---|
@file | 文件名 |
@mainpage | 工程概览 |
@author | 作者的信息 |
邮箱 | |
@date | 年-月-日 |
@version | 版本号 |
@license | 版权 |
@brief | 用于class 或function的简易说明 |
@details | 用于class 或function的详细说明 |
@param | 主要用于函数说明中,后面接参数的名字,然后再接关于该参数的说明 |
@param [in] | 输入参数说明 |
@param [out] | 输出参数说明 |
@return | 描述该函数的返回值情况eg:@return 本函数返回执行结果,若成功则返回TRUE,否则返回FLASE |
@retval | 描述 返回值类型eg:@retval NULL 空字符串。 @retval !NULL 非空字符串。 |
@ note | 注解 |
@attention | 注意 |
@ warning | 警告信息 |
@enum | 引用了某个枚举,Doxygen会在该枚举处产生一个链接eg :@enum CTest::MyEnum |
@var | 引用了某个变量,Doxygen会在该枚举处产生一个链接eg :@var CTest::m_FileKey |
@class | 引用某个类,格式:@class [] []eg:@class CTest “inc/class.h” |
@exception | 可能产生的异常描述eg:@exception 本函数执行可能会产生超出范围的异常 |
@todo | 对将要做的事情进行注释 |
@see | 一段包含其他部分引用的注释,中间包含对其他代码项的名称,自动产生对其的引用链接。 |
relates | 通常用做把非成员函数的注释文档包含在类的说明文档中 |
deprecated | |
@pre | 用来说明代码项的前提条件。 |
@post | 用来说明代码项之后的使用条件。 |
@code | 在注释中开始说明一段代码,直到@endcode命令。 |
@endcode | 注释中代码段的结束。 |
在上述界面中点击Expert按钮,或者用文本方式打开Doxyfile文件,可以看到Doxygen的参数配置项特别多,各个参数的含义其实也并不难掌握,在Doxygen的帮助手册中有详细的介绍,下面我介绍一些常用的参数含义,其余的参数大多可以设置为默认值。
名称 | 含义 |
---|---|
DOXYFILE_ENCODING | Doxygen文件的编码方式,默认为UTF-8,若希望支持中文,最好设置为 GB2312 |
PROJECT_NAME | Project 的名字,以一个单词为主,多个单词请使用双引号括住。 |
PROJECT_VERSION | Project的版本号码。 |
OUTPUT_DIRECTORY | 输出路径。产生的文件会放在这个路径之下。如果没有填这个路径,将会以目前所在路径作为输出路径。 |
OUTPUT_LANGUAGE | 输出语言, 默认为English 。 |
EXTRACT_ALL | 为NO,只解释有doxygen格式注释的代码;为YES,解析所有代码,即使没有注释 |
EXTRACT_PRIVATE | 是否解析类的私有成员 |
EXTRACT_STATIC | 是否解析静态项 |
EXTRACT_LOCAL_CLASSES | 是否解析源文件(cpp文件)中定义的类 |
INPUT | 指定加载或找寻要处理的程序代码文件路径。这边是一个表列式的型态。并且可指定档案及路径。 |
FILE_PATTERNS | 如果您的INPUT Tag 中指定了目录。您可以透过这个Tag来要求Doxygen在处理时,只针对特定的档案进行动作。例如:您希望对目录下的扩展名为.c, .cpp及.h的档案作处理。您可设定FILE_PATTERNS = *.c, *.cpp, *.h。 |
RECURSIVE | 这是一个布尔值的Tag,只接受YES或NO。当设定为YES时,INPUT所指定目录的所有子目录都会被处理. |
EXCLUDE | 如果您有某几个特定档案或是目录,不希望经过Doxygen处理。您可在这个Tag中指定。 |
EXCLUDE_PATTERNS | 类似于FILE_PATTERNS的用法,只是这个Tag是供EXCLUDE所使用。 |
SOURCE_BROWSER | 如果设定为YES,则Doxygen会产生出源文件的列表,以供查阅。 |
INLINE_SOURCES | 如果设定为YES ,则函数和类的实现代码被包含在文档中 |
ALPHABETICAL_INDEX | 如果设定为YES,则一个依照字母排序的列表会加入在产生的文件中。(有很多类、结构等项时建议设为YES) |
GENERATE_HTML | 若设定为YES ,就会产生HTML版本的说明文件。HTML文件是Doxygen预设产生的格式之一。 |
HTML_OUTPUT | HTML文件的输出目录。这是一个相对路径,所以实际的路径为OUTPUT_DIRECTORY加上HTML_OUTPUT。这个设定预设为html。 |
GENERATE_HTMLHELP | 是否生成压缩HTML格式文档(.chm) |
HTML_FILE_EXTENSION | HTML文件的扩展名。预设为.html。 |
HTML_HEADER | 要使用在每一页HTML文件中的Header。如果没有指定,Doxygen会使用自己预设的Header。 |
HTML_FOOTER | 要使用在每一页HTML文件中的Footer。如果没有指定,Doxygen会使用自己预设的Footer。 |
HTML_STYLESHEET | 您可给定一个CSS 的设定,让HTML的输出结果更完美。 |
GENERATE_HTMLHELP | 如设定为YES,Doxygen会产生一个索引文件。这个索引文件在您需要制作windows 上的HTML格式的HELP档案时会用的上。 |
GENERATE_TREEVIEW | 若设定为YES,Doxygen会帮您产生一个树状结构,在画面左侧。这个树状结构是以JavaScript所写成。所以需要新版的Browser才能正确显示。 |
TREEVIEW_WIDTH | 用来设定树状结构在画面上的宽度。 |
GENERATE_LATEX | 设定为YES 时,会产生LaTeX 的文件。不过您的系统必需要有安装LaTeX 的相关工具。 |
LATEX_OUTPUT | LaTeX文件的输出目录,与HTML_OUTPUT用法相同,一样是指在OUTPUT_DIRECTORY之下的路径。预设为latex。 |
LATEX_CMD_NAME | LaTeX程序的命令名称及档案所在。预设为latex。 |
GENERATE_RTF | 若设定为YES ,则会产生RTF 格式的说明档。 |
RTF_OUTPUT | 与HTML_OUTPUT 用法相同,用来指定RTF 输出档案路径。预设为rtf。 |
GENERATE_MAN | 若设定为YES ,则会产生Unix Man Page 格式的说明文件。 |
MAN_OUTPUT | 与HTML_OUTPUT 用法相同,用来指定Man Page的输出目录。预设为man。 |
GENERATE_XML | 若设定为YES ,则会产生XML 格式的说明文件。 |
ENABLE_PREPROCESSING | 若设定为YES ,则Doxygen 会激活C 的前置处理器来处理原始档。 |
PREDEFINED | 可以让您自行定义一些宏。类似于gcc 中的-D选项。 |
CLASS_DIAGRAMS | 这个标记用来生成类继承层次结构图。要想生成更好的视图,可以从 Graphviz 下载站点 下载 dot 工具。Doxyfile 中的以下标记用来生成图表: |
HAVE_DOT | 如果这个标记设置为 Yes,doxygen 就使用 dot 工具生成更强大的图形,比如帮助理解类成员及其数据结构的协作图。注意,如果这个标记设置为 Yes, |
CLASS_GRAPH | 如果 |
GRAPHICAL_HIERARCHY | 设置为YES时,将会绘制一个图形表示的类图结构 |
上面的表格只是描述了一些常用的配置,需要更加详细的信息请参考Doxygen的帮助手册。
DOXYFILE_ENCODING
指定文件中所有字符的编码格式。在此标记出现之前默认使用 UTF-8。Doxygen 可以使用 libiconv(或在 libc中创建 iconv)实现编码转换。查阅 中列出的编码格式。
PROJECT_NAME
此标记是一个单词(或者使用双引号可包含一个字串),用于标识生成的文档项目,这个名称可用于大多数生成页面的标题或某些地方。
PROJECT_NUMBER
此标记能用于记录一个项目或是修订版本号,能非常容易地将生成的文档进行归类,或是被一些版本控制系统所使用。
OUTPUT_DIRECTORY
指定一个(相对或绝对)的路径,用于生成文档的写入点。如果是一个相对路径,它将会关联到启动 doxygen 的位置。如果留空则表示当前目录将被使用。
CREATE_SUBDIRS
如果此标记设定为 YES,在每种输出格式的输出目录下,doxygen 将创建 4096 个子目录(主输出目录的下 2 层中),并分发生成文件到这些目录中。当提供了一个数量巨大的源码文件集给 doxygen 时,如果将所有的生成文件都放置到同一目录下,这将导致文件系统的性能问题,而此时有效 CREATE_SUBDIRS 选项将非常有益处。
OUTPUT_LANGUAGE
用于指定所有生成文档的语言,doxygen 将使用此信息,生成指定语言的所有常规输出。默认语言是英语,其他支持的语言有:南非荷兰语,阿拉伯语,巴西语,加泰罗尼亚语,汉语,克罗地亚语,捷克语,丹麦语,荷兰语,芬兰语,法语,德语,希腊语,匈牙利语,意大利语,日语,韩语,立陶宛语,挪威语,波斯语,波兰语,葡萄牙语,罗马尼亚语,俄语,塞尔维亚语,斯洛伐克语,斯洛文尼亚语,西班牙语,瑞典语,乌克兰语。
BRIEF_MEMBER_DESC
假如此标记设为 YES(默认值),doxygen 将在文件和类文档(类似于 JavaDoc)中列出的成员之后加入简明的成员描述,若设为 NO 则无效。
REPEAT_BRIEF
如果此标记设为 YES(默认值),doxygen 将会在详细描述之前加入一个成员或函数的简明描述。 注意,若 HIDE_UNDOC_MEMBERS 和 BRIEF_MEMBER_DESC 都设为 NO,简明描述将被完全隐藏。
ABBREVIATE_BRIEF
这个标记采用了一种仿智能的简明描述的缩写工具,用于多个列表中的文本。在列表的每个字串中,如果查找到简明描述的首位字符,会在整个列表处理之后的结果和文本中剔除,可看成为附加说明的文本。否则将维持原状。
如果标记之后留空,下面的值将被使用(“$name”自动替换某些实体的名称): n a m e 类 , name 类, name类,name 部件,以及$name
文件。If left blank, the following values are used ("$name" is automatically replaced with the name of the entity): “The $name class” “The $name widget” “The $name file” “is” “provides” “specifies” “contains” “represents” “a” “an” “the”.
ALWAYS_DETAILED_SEC
如果 ALWAYS_DETAILED_SEC 和 REPEAT_BRIEF 都设为 YES,在只有一个简明描述的地方 doxygen 将生成一个详细的小节。
INLINE_INHERITED_MEMB若设为 YES,doxygen 将在类文档中显示类的所有派生成员。并假定这些成员均为普通类成员。基类的构造器,析构器以及赋值操作符将不会显示。
FULL_PATH_NAMES
若设为 YES,doxygen 将在文件列表和头文件中的文件名之前加入完整路径。若设为 NO,将使用能保证文件名唯 一性的最短路径。
STRIP_FROM_PATH
若 FULL_PATH_NAMES 设为 YES,STRIP_FROM_PATH 用于去除路径中用户自定义的部分,且只会去除与路径左起匹配的多个指定字串,此标记能够显示文件列表中相关的路径,假如标记后留白此标记无效。
STRIP_FROM_INC_PATH
从类文档内所涉及的路径中,去除用户自定义的部分,它将告知阅读者一个类将包含那些头文件。假如标记后留 白,只会使用类定义中的头文件名。否则将会在正常编译时使用-I 参数指定,此标记之后的包含路径。
CASE_SENSE_NAMES
若设为 NO,doxygen 将只生成小写字母的文件名,若设为 YES,允许使用大写字母。如果你的类或文件名之间存在同名但有大小写的差异,以及你的文件系统支持大小写敏感的文件名,那么这个标记是非常有用的。Windows用户可设为 NO 忽略它。
SHORT_NAMES
若设为 YES,doxygen 将生成最短(但可读)的文件名。当你的文件系统不支持长文件名,如 DOS,Mac,CD-ROM时,这个标记是非常有用的。
JAVADOC_AUTOBRIEF
若设为 YES,doxygen 将会使用一个 JavaDoc 风格的注释,作为简明描述来表述第一行(直到第一行结束)。若设为 NO(默认值),JavaDoc 风格看上去更象是一个标准的 Qt 注释(这里需要一个@brief 命令来生成一个简明描述)。
QT_AUTOBRIEF
若设为 YES,doxygen 将会使用一个 Qt 风格的注释,作为简明描述来表述第一行(直到第一行结束)。若设为 NO (默认值),Qt 风格看上去更象是一个标准的 Qt 注释(这里需要一个\brief 命令来生成一个简明描述)。
BUILTIN_STL_SUPPORT
如果你使用了 STL 类(如 std::string,std::vector 等等),但又不希望包含(在一个标记中)STL 库,那么可将此标记设为 YES,使得 doxygen 能够匹配包含 STL 类的函数声明和定义(例如 func(std::string)等同于func(std::string) {}),这也使得继承和协作图中,涉及到 STL 类的部分更加完整和准确。
CPP_CLI_SUPPORT
假如你使用了微软的 C++/CLI 语言,可设为 YES 使能解析支持。
SIP_SUPPORT
如果你的项目中只包含 SIP 源码可设为 YES,doxygen 解析时会将其看成一般的 C++代码,但是当 protection 关 键字没有出现时,会假定所有的类都使用了公有继承而不是私有继承。
** SIP 是一个自动生成 C/C++库的 Python 绑定端的工具,原本是为了 PyQt(Qt GUI 工具包的绑定端)而开发的,时间始于 1998 年。但它更适合生成任意 C/C++库的绑定端。参考页面
IDL_PROPERTY_SUPPORT
微软 IDL 的获取和设定特性,用于表示一个属性获取和设定的方法。设置这个选项为 YES(默认),使得 doxygen在文档中覆盖掉属性的获取和设定方法,这只能工作在这些方法获取和设定简单类型时。如果不是这种情况,而 总是希望显示这些方法,那么将此选项设为 NO。
DISTRIBUTE_GROUP_DOC
如果在文档中使用了成员组,以及此选项设为 YES,为了组中的其他成员,doxygen 将会重复使用用文档中组的第一个成员(如果有),then doxygen will reuse the documentation of the first member in the group (ifany) for the other members of the group 组默认情况下,所有的组成员必须被显示文档化。
MULTILINE_CPP_IS_BRIEF
若设为 YES,doxygen 需要处理一个多行的 C++特殊注释块(如,//!或///的注释块),类似于一个简明描述。 这是一个默认状态。最新修订后的默认状态则是将上述的特殊注释块看作一个细节描述。如果你接受修改后的默 认状态,可将此标记设为 YES,注意,此标记设为 YES,也就意味着 rational rose 的注释无法被完全辨别。
INHERIT_DOCS
若设为 YES(默认值),那么一个未文档化成员继承于其他文档化成员,它将重新执行文档化。If the INHERIT_DOCS tag is set to YES (the default) then an undocumented member inherits the documentation from any documented member that it re-implements
SEPARATE_MEMBER_PAGES
若设为 YES,doxygen 将为每一个成员建立一个新页,若设为 NO,成员文档将成为文件/类/名字空间文档中的一部分。
TAB_SIZE
设置制表符的大小,doxygen 使用这个数值替换掉代码段中的空格数。
ALIASES
在文档中用于指定一定数量的 alias,等同于命令。一个 alias 有以下的式,
name=value
这里增加一个例子:
“sideeffect=\par Side Effects:\n”
它允许你放置\sideeffect(或@sideeffect)命令在文档中,这将导致在用户定义的段落标题为“Side Effects:”,
你可放置\Side Effects:插入换行符。You can put \n’s in the value part of an alias to insert newlines.
OPTIMIZE_OUTPUT_FOR_C
若设为 YES,如果你的项目中只包含 C 源码,doxygen 将为 C 生成更适合的输出,比如,使用一些不同的名称,忽略所有成员的列表,等等。
OPTIMIZE_OUTPUT_JAVA
若设为 YES,如果你的项目中只包含 Java 或 Python 的源码,doxygen 将为这些语言生成更适合的输出,比如出 现的名字空间将被看做包,获取认证的范围将会有差异,等等。
OPTIMIZE_FOR_FORTRAN
若设为 YES,如果你的项目中只包含 Fortran 的源码,doxygen 将为它生成更适合的输出。
OPTIMIZE_OUTPUT_VHDL
若设为 YES,如果你的项目中只包含 VHDL 的源码,doxygen 将为它生成更适合的输出。
EXTENSION_MAPPING
Doxygen 使用它能够解析的文件扩展名,来选择解析器, 此标记能为解析器分配一个给定的扩展名,doxygen 有一个内建的映射,但你可以使用此标记覆盖或扩展它。格式为 ext=language,ext 即文件的扩展名,language则为 doxygen 所支持的解析器中的一个:IDL, Java, Javascript, C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++。比如使得 doxygen 将.inc 看做 Fortran 文件(默认为 PHP 文件),.f 看做 C 文件(默认为 Fortran 文件),可以使用:inc=Fortran,f=C。
SUBGROUPING
若设为 YES(默认),允许相同类型的类成员组(比如一个公有函数组)被放置到此类型的子分组中(如在 Public Functions 小节下),设为 NO 禁用子分组。另外,对每个类使用\nosubgrouping 命令同样可禁用子分组。
TYPEDEF_HIDES_STRUCT
若设为YES,文档化的结构,联合或枚举的类型定义,将被看做它们类型的名称。如typedef struct TypeS {} TypeT, 那么文档中就存在一个名为 TypeT 的结构,当无效这个类型定义时,它有可能是文件,名字空间或类的成员,而 这个结构将被命令为 TypeS,这对于 C 代码是非常有价值的,可在编码约定中指定所有的混合类型的定义,以及只对此类型定义进行引用,而不需要标记名称。
SYMBOL_CACHE_SIZE
它会决定内部缓存的大小,以此来确定那些符号应保存在内存,而那些应更新到磁盘中。当缓存已满不经常被使用的符号将被写入到磁盘中。对于小中型项目(小于 1000 个输入文件)来说,默认值已经能满足你的要求。对于大型项目来说,缓存过小,有可能导致 doxygen 频繁与磁盘交换符号而花费大量的时间,而造成性能的下降。
如果系统中有足够的物理内存,可增加缓冲来保存更多的符号以改善性能。注意,缓存实际大小在一个对数范围内变化,所以增加的缓存大小应该会超过原来的一倍。缓冲大小的计算公式: 有效的范围是 0~9,默认为 0,相应缓存的大小为 。
EXTRACT_ALL
若设为 YES, doxygen 会假定文档中的所有主体将被文档化,即使在未提供文档的情况下。私有类成员和文件静 态成员将隐藏,直到 EXTRACT_PRIVATE 和 EXTRACT_STATIC 标记设为 YES。
注意: 当 WARNINGS 设为 YES 时,将无效生成过程中未文档化成员发出的警告。
EXTRACT_PRIVATE
若设为 YES,在文档中将包含所有类私有成员。
EXTRACT_STATIC
若设为 YES,在文档中将包含所有文件的静态成员。
EXTRACT_LOCAL_CLASSES
若设为 YES,在文档中将包含在源文件中定义的类(和结构),若设为 NO,只包含在头文件中定义的类。对于 Java源码无任何影响。
EXTRACT_ANON_NSPACES
若设为 YES,匿名空间的成员将被提取到文档中,并被称为anonymous_namespace{file}的名字空间,file 可使用匿名空间包含的文件基类名进行替换。默认情况下,匿名空间将被隐藏。
EXTRACT_LOCAL_METHODS
这个标记只对 Object-C 代码有效,当设为 YES 时,在文档中包含的局部方法将在执行部分被定义,而不会在接 口中。若设为 NO(默认),只有在接口中的方法才会被包含到文档。
HIDE_UNDOC_MEMBERS
若设为 YES,doxygen 将隐藏在文档化的类或文件中的所有未文档化的成员,若设为 NO(默认),这些成员将包含在一些预览中,但不会有文档小节生成,如果 EXTRACT_ALL 为 YES,此选项无效。
HIDE_UNDOC_CLASSES
若设为 YES,doxygen 将隐藏所有未文档化的类,若设为 NO(默认),这些类将被包含在一些预览中,但不会有文档小节生成,如果 EXTRACT_ALL 为 YES,此选项无效。
HIDE_FRIEND_COMPOUNDS
若设为 YES,doxygen 将隐藏所有友元(类|结构|联合)声明,若设为 NO(默认),这些声明将包含在文档中。
HIDE_IN_BODY_DOCS
若设为 YES,doxygen 将隐藏函数主体中的一些文档块,若设为 NO(默认),这些块将出现在函数的细节文档块中。
INTERNAL_DOCS
用于确认在一个\internal 命令之后能否包含文档。若设为 NO(默认),那么文档将被移除,如设为 YES,将包含内部文档。
HIDE_SCOPE_NAMES
若设为 NO(默认),doxygen 将显示文档中类成员和名字空间的作用域,若设为 YES,此作用域将被隐藏。
SHOW_INCLUDE_FILES
若设为 YES(默认),doxygen 将在文件的文档中放置它所包含文件的列表。
FORCE_LOCAL_INCLUDES
若设为 YES,doxygen 将会在文档中使用双引号列出所包含的文件,而不是尖括号。
INLINE_INFO
若设为 YES(默认),将在文档中插入 inline 标记来指示 inline 成员。
SORT_MEMBER_DOCS
若设为 YES(默认),doxygen 将按英文字母的顺序对文件和类的成员名字进行文档排序,若设为 NO,成员将按声明的顺序出现。
SORT_BRIEF_DOCS
若设为 YES,doxygen 会按英文字母的顺序将文件,名字空间和类的成员名字,作为它们简明描述的排序依据,若设为 NO(默认),成员将按声明的顺序出现。
SORT_GROUP_NAMES
若设为 YES,doxygen 会按英文字母的顺序对组名的层级进行排序。若设为 NO(默认),组名将按定义的顺序出现。
SORT_BY_SCOPE_NAME
若设为 YES,将由类的全称(即包含名字空间)对类列表进行排序。若设为 NO(默认),类列表排序只能由不包含名字空间的类名决定。
注意:
如果 HIDE_SCOPE_NAMES 设为 YES,这个选项不太有价值。
此选项只适用于类列表,且不是按字母排序的列表。
SORT_MEMBERS_CTORS_1 ST
若设为 YES,doxygen 将对类成员的(简明和细节描述)文档进行排序,且构造器和析构器将位于列表首部。若 设为 NO(默认),构造器将出现在 SORT_MEMBER_DOCS,SORT_BRIEF_DOCS 所设定的各自定义的位置。
注意:
若 SORT_BRIEF_DOCS 设为 NO,此选项将忽略成员简明描述的排序。 若 SORT_MEMBER_DOCS 设为 NO,此选项将忽略成员细节描述的排序。
GENERATE_DEPRECATEDLIST
用于有效(YES)或失效(NO)废弃列表(主要针对类和类方法),通过放置\deprecated 命令来创建废弃列表。
GENERATE_TESTLIST
用于有效(YES)或失效(NO)测试列表,通过放置\test 命令来创建测试列表。
GENERATE_BUGLIST
用于有效(YES)或失效(NO)bug 列表,通过放置\bug 命令来创建 bug 列表。
ENABLED_SECTIONS
用于有效某些条件化文档小节,可使用标记,\if <小节标号> … \endif 和\cond <小节标号> … \endcond 的块结构。
MAX_INITIALIZER_LINES
用于确定一个变量或定义初始化时能使用的最大文本行数,如果初始化时的行数超过最大值,那么它将被隐藏。将最大值设为 0 将完全隐藏初始化的文本。可在文档中使用\showinitializer 和\hideinitializer 命令,来控 制个别变量和定义的初始化文本。
SHOW_USED_FILES
若设为 NO,在类和结构文档的底部无效文件列表的生成。若设为 YES,列表将会提取那些已被用于生成文档的文件。
SHOW_DIRECTORIES
如果你项目中源码分布在多个目录下,可设定此选项为 YES,在文档中显示出源码目录的层级。
SHOW_FILES
若设为 NO,将无效文件页面的生成,并将文件从快速索引和文件树浏览(如果指定)中移除。默认设定为 YES。
SHOW_NAMESPACES
若设定为 NO,将无效名字空间页面的生成,并将名字空间从快速索引和文件树浏览(如果指定)中移除。默认设定为 YES。
QUIET
用于打开或关闭 doxygen 生成输出时的消息,若设定 YES 表明关闭消息,若留白则设定为 NO。
WARNINGS
用于打开或关闭 doxygen 生成错误记录时的警告消息,若设定 YES 表明打开警告消息,若留白则设定为 NO。
技巧:当写文档时应打开警告消息。
WARN_IF_UNDOCUMENTED
若设为 YES,doxygen 将为未文档化的成员生成警告消息,如果 EXTRACT_ALL 设为 YES,那么该标记将自动失效。
WARN_IF_DOC_ERROR
若设为 YES,doxygen 将为文档中潜在的错误生成警告消息,例如在一个文档化函数中并没有文档化一些参数,或文档化的参数并不存在,又或者使用了错误的标记命令。
WARN_NO_PARAMDOC
用于获得文档化函数所生成警告消息,但不能兼顾到它的参数和返回值。若设为 NO(默认)doxygen 只能生成错 误或参数文档不完整的警告,而不能监控文档的缺失。
WARN_FORMAT
确定 doxygen 所生成警告消息的格式,消息字串会包含$file, $line, $text 标记,并且这些标记将被发出警告的文件名,行号,以及相应的文本所替换。
WARN_LOGFILE
用于指定一个警告和错误消息写入的日志文件,如果留空表示将消息写入 stderr。
INPUT
用于指定将被文档化的源文件和目录,你可以输入 myfile.cpp 文件名或/usr/src/myproject 目录名,多个文件名或目录名可用空格进行分离。
注意:如果此标记留空,那么将搜索当前目录。
INPUT_ENCODING
用于指定 doxygen解析源文件所使用字符编码,doxygen 内部使用 UTF-8 编码,同样也是默认的输入编码。 Doxygen可使用 libiconv(或者在 libc 中创建 iconv)进行编码转换。查看编码列表。
FILE_PATTERNS
如果 INPUT 包含有目录,可用此选项指定一个或多个通配符(如*.cpp 和*.h)在目录过滤源文件。假如选项后留空,以下的扩展名将用于过滤:.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp .h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm 。
FILE_VERSION_FILTER
用于指定一个程序或脚本,使得 doxygen 能调用每个文件以获得当前版本(一般通过 CVS 版本控制系统获取),且 doxygen 将会执行(使用 popen()) command input-file 命令来调用该程序,其中 command 为FILE_VERSION_FILTER 后跟的设定名称,input-file 则为 doxygen 所支持的输入文件名。无论该程序向标准输出写入任何内容,都将被用做文件版本。
Unix 下使用一个 shell 脚本过滤器的例子:
FILE_VERSION_FILTER = "/bin/sh versionfilter.sh"
CVS 的脚本例子:
#!/bin/sh cvs status $1 | sed -n 's/^[ \]*Working revision:[ \t]*\([0-9][0-9\.]*\).*/\1/p'
SVN 的脚本例子:
#!/bin/sh svn stat -v $1 | sed -n 's/^[ A-Z?\*|!]\{1,15\}/r/;s/ \{1,15\}/\/r/;s/ .*//p'
ClearCase 过滤器的例子:
FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
LAYOUT_FILE
用于指定一个能被 doxygen 解析的布局文件。在一种独立的输出格式中,此布局文件可以控制所生成的输出文件的全局结构。创建默认的布局文件可运行 doxygen 附带-l 选项,并且可选择在选项之后是否指定一个文件名,如 果文件名被忽略将使用 DoxygenLayout.xml,注意,如果你运行 doxygen 的目录中已经包含了一个名为DoxygenLayout.xml 的文件时,倘若 LAYOUT_FILE 之后留空 doxygen 将自动解析该文件。
RECURSIVE
用于是否在子目录中搜索可用的输入文件,如果选项之后留空则设为 NO。
EXCLUDE
用于指定那些文件和目录将从 INPUT 选项中将被移除。这种方式使你很容易得从 INPUT 选项设定根目录树中,移 除一个子目录。
EXCLUDE_SYMLINKS
用于选择是否从输出中移除文件或者目录的符号链接(一个 Unix 文件系统的特性)。
EXCLUDE_PATTERNS
在 INPUT 选项设定的目录中,使用该选项指定的一个或多个通配符来移除匹配的文件。
注意,通配符将对文件的绝对路径进行匹配,如移除所有的测试目录,可使用*/test/*的样式。
EXAMPLE_PATH
指定一个或多个包含例子代码段的文件或包含例子文件的目录。(在\include 小节中查看\include 命令)
EXAMPLE_RECURSIVE
若设为 YES,将在子目录中搜索输入例子文件,可使用\include 或\dontinclude 命令,它与 RECURSIVE 无关,如 果选项之后留空则设为 NO。
EXAMPLE_PATTERNS
若 EXAMPLE_PATH 选项之后含有目录,可用此标记指定一个或多个通配符(如*.cpp 和*.h),从上述目录中过滤掉匹配的文件,如果选项后留空则设为 NO。
IMAGE_PATH
用于在文档中指定一个或多个包含图片的文件或是包含图片文件的目录。(查看\image 命令)
INPUT_FILTER
指定一个程序,使得 doxygen 对每一个输入文件进行过滤,doxygen 调用过滤程序可以执行(使用 popen())这个命令:
则为 INPUT_FILTER 的设定值,
则为输入文件名,doxygen 会将过滤程序的输出写入到标准输
出中。
FILTER_PATTERNS
用于在每种文件样式的基础上指定过滤规则。Doxygen 将会比较文件名和每一种样式,并检查是否与过滤规则匹配。这些过滤规则来自一个列表:pattern=filter(如*.cpp=my_cpp_filter),查看 INPUT_FILTER 进一步获得如何使用过滤器的信息,假设选项后留空,INPUT_FILTER 将用于全部文件。
FILTER_SOURCE_FILES
若设为 YES,输入过滤器(可使用 INPUT_FILTER 设定)既可过滤输入文件,也可用于生成源文件的浏览(当SOURCE_BROWSER 设为 YES 时)。
SOURCE_BROWSER
若设为 YES,将生成一个源码文件的列表。文档主体部分将对这些源码进行交叉引用。 注意,在生成输出的过程中与所有源码的关联有可能失效,因此要确认 VERBATIM_HEADERS 是否设为 NO。
INLINE_SOURCES
若设为 YES,在文档中将直接包含函数,类,枚举的代码段。
STRIP_CODE_COMMENTS
若为 YES(默认),告知 doxygen 隐藏一些来自源码段中特殊的注释块,正常情况下 C 和 C++的注释始终可见。
REFERENCED_BY_RELATION
若为 YES,所有的文档化函数都将会列出其引用过的函数。
REFERENCES_RELATION
若为 YES,所有的文档化实体都将会列出其调用或使用过的函数。
REFERENCES_LINK_SOURCE
若为 YES(默认),且 SOURCE_BROWSER 也为 YES,那么 REFERENCES_RELATION,REFERENCED_BY_RELATION 所生成列表中函数的超链接将指向源码,否则将指向该函数的文档。
VERBATIM_HEADERS
若为 YES(默认),doxygen 将为类所指定的头文件,生成一个相同的副本,doxygen will generate a verbatim copy of the header file for each class for which an include is specified 若为 NO 则无效。 也可查看\class 小节。
USE_HTAGS
若为 YES,对于源码的引用,将指向由 htags 工具而非 doxygen 内建的源码浏览器生成的 HTML。Htags 工具是 GNU 全局源码标签系统 GNU’s global source tagging system 的一部分(参看)。按以下步骤使用 htags 工具:
安装最新的版本(如 4.8.6 或更新的)
有效 SOURCE_BROWSER,USE_HTAGS
确认 INPUT 指向的是源码树的根目录
正常运行 doxygen
Doxygen 将调用 htags(依次调用 gtags),这些工具只有在命令行下才有效(并存在于系统的检索路径中)。
得到的结果,可替代 doxygen 所生成的源码浏览器,指向源码的链接将会指向 htags 的输出。
ALPHABETICAL_INDEX
若为 YES,将会生成一个所有合成部分的字母索引。如果项目中包含一些类,结构,联合和接口时,应有效此标记。
COLS_IN_ALPHA_INDEX
如果 ALPHABETICAL_INDEX 有效,那么此标记可用于指定每列的间距(间距的范围是 1~20)。
IGNORE_PREFIX
项目中所有的类都是由一个公共的前缀开始,那么所有的类也将被放置到字母索引中相同的首部之下。此标记可指定一个特殊的前缀(或是一个前缀列表),当生成索引首部时却可以忽略掉。
GENERATE_HTML
若为 YES(默认),doxygen 将生成 HTML 输出。
HTML_OUTPUT
指定 HTML 文档所存放的位置。如果此标记后为一相对路径,则 OUTPUT_DIRECTORY
的值将被放置到它之前。如果标记后留空,则将 html 作为默认路径。
HTML_FILE_EXTENSION
指定生成的 HTML 页面文件的扩展名(例如:.htm,.php,.asp),如果标记后留空,doxygen 将生成 .html 文件。
HTML_HEADER
指定生成的 HTML 页面中用户自定义的页头。为获得有效 HTML 页头至少要包含一个和一个```标记,但 更好的办法是,包含 doxygen 生成的样式表。最小化的例子:
<HTML> <HEAD> <TITLE>My titleTITLE> <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css"> HEAD> <BODY BGCOLOR="#FFFFFF">
如果选项后留空,doxygen 将生成一个标准页头。
以下是包含在页头和页脚中具有特定意义的标识:
$title 替换页面的标题
$datetime
替换当前的日期和时间
$date
替换当前的日期
$year
替换当前的年份
$doxygenversion 替换 doxygen 的版本
$projectname
替换项目的名称(查看 PROJECT_NAME)
$projectnumber 替换项目的编号(查看 PROJECT_NUMBER)
r e l p a t h relpath relpath 如果 CREATE_SUBDIRS 有效, r e l p a t h relpath relpath命令将生成一个关联到 HTML 输出目录的相对路
径,如使用 r e l p a t h relpath relpathdoxygen.css,来引用一个标准的样式表。
查看“doxygen 用法”小节获得如何使用 doxygen 生成默认页头的信息。
HTML_FOOTER
指定生成的 HTML 页面中用户自定义的页脚,为获得有效 HTML 页脚至少要包含一个和一个