Doxygen给C程序生成注释文档
近段时间,一直在学习华为C语言编程规范(2011版),在“注释”这一章中发现了一种“Doxygen”的注释转文档工具,查看诸多相关资料,并进行编程实践,终于可以利用Doxygen给C程序生成注释文档。在使用过程中,我已经深深地喜欢Doxygen,并在写代码时使用Javadoc注释风格。
本文由三部分组成:1)工具下载及安装;2)编写Doxygen可识别的注释;3)利用Doxygen工具将注释转换成API文档。
1、工具下载及安装
(1)Doxygen可以从一套源文件开始,生成HTML格式的在线类浏览器。笔者采用的版本是Doxygen1.8.9.1
(2)Microsoft HTML Help Workshop是微软开发,用于本工程创建*.chm文件,笔者上官网下载最新的htmlhelp
(3)Graphviz用于配合doxygen使用,提取函数之间、头文件之间的调用关系,笔者使用的版本是graphviz-2.38.
2、编写Doxygen可识别的注释
(1)注释模板
本文采用的是Javadoc风格的注释,参照CSDN博客上的注释模板;
一、文件注释
/**
* @file CommonType.h
* @brief 常见类型定义
* @author Vincent
* @date 2015-5-24
* @version A001
* @copyright Vincent
*/
二、函数注释
/**
* 读取文件
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @param[in] dataLen 数据长度
* @param[out] fileData 输出数据
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
* @see
* @note
*/
UINT ReadFile(UINT fileNameLen, BYTE *fileName, UINT dataLen, BYTE *fileData);
三、类型/宏定义注释
/**
* 2字节字符类型
*/
typedef unsigned short WORD;
四、枚举/结构注释
/** 枚举类型*/
enum COLOR{
RED=, ///< 红色
GREEN=1,///< 绿色
YELLOW=2///< 黄色
};
(2)Doxygen工程实例
为了让接触Doxygen工具的人快速上手,笔者使用VC++6.0创建了一个DoxygenTest工程,并为其编写测试代码以及Javadoc风格的注释,工程的文件列表如下图所示,并依次展示每个文件的代码。

AddrDefine.h
/**
* @file AddrDefine.h
* @brief 地址定义
*/
#ifndef ADDR_DEFINE_H
#define ADDR_DEFINE_H /**@name 地址定义
* @{
*/
#define ADDR_FILE_START 0x00000000 ///<文件起始地址
#define ADDR_DIR_START 0x00000001 ///<目录起始地址
/**@} */ #endif
CommonType.h
/**
* @file CommonType.h
* @brief 常见类型定义
* @author Vincent
* @date 2015-5-24
* @version A001
* @copyright Vincent
*/
#ifndef COMMON_TYPE_H
#define COMMON_TYPE_H /**
* 4字节字符类型
*/
typedef unsigned int UINT; /**
* 1字节字符类型
*/
typedef unsigned char BYTE; /**
* 2字节字符类型
*/
typedef unsigned short WORD; /** 坐标系类型 */
typedef struct{
int x;///<横坐标
int y;///<纵坐标
}Coordinator; /** 枚举类型*/
enum COLOR{
RED=, ///< 红色
GREEN=1,///< 绿色
YELLOW=2///< 黄色
}; /** 空的宏定义*/
#define NULL 0
#endif
RetCode.h
/**
* @file RetCode.h
* @brief 错误码返回值
* @author Vincent
* @date 2015-5-24
* @version A001
* @par Copyright (c): Vincent
*/ #ifndef RET_CODE_H
#define RET_CODE_H /**@name 执行状态
* @{
*/
#define SUCCESS 0x00000000 ///<执行成功
#define ERR_PARA_LEN 0x00000001 ///<长度错误
#define ERR_NULL_POINT 0x00000002 ///<空指针错误
#define ERR_PARA_TYPE 0x00000003 ///<参数类型错误
/** @}*/ #endif
DoxygenFile.h
/**
* @file DoxygenFile.h
* @brief 中间层,用于处理数据
* @author Vincent
* @date 2015-5-24
* @version A001
* @par Copyright (c): Vincent
*/
#ifndef DOXYGEN_FILE_H
#define DOXYGEN_FILE_H #include "CommonType.h" /**
* 写入一些内容
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @param[out] fileData 文件数据
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
*/
int HandleData(UINT fileNameLen,BYTE *fileName, BYTE *fileData); #endif
DoxygenFile.c
#include "DoxygenFile.h"
#include "HandleFile.h" /**
* 写入一些内容
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @param[out] fileData 文件数据
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
*/
int HandleData(UINT fileNameLen,BYTE *fileName, BYTE *fileData)
{
UINT retCode;
retCode = ReadFile(,NULL,,NULL);
return retCode;
}
HandleFile.h
/**
* @file HandleFile.h
* @brief 操作文件
* @details 所有涉及文件操作
* @author Vincent
* @date 2015-5-24
* @version A001
* @par Copyright (c): Vincent
*/
#ifndef HANDLE_FILE_H
#define HANDLE_FILE_H
#include "CommonType.h" /**
* 读取文件
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @param[in] dataLen 数据长度
* @param[out] fileData 输出数据
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
* @see
* @note
*/
UINT ReadFile(UINT fileNameLen, BYTE *fileName, UINT dataLen, BYTE *fileData); /**
* 写入文件
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @param[out] fileData 输出数据
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
* @see
* @note
*/
UINT WriteFile(UINT fileNameLen, BYTE *fileName, BYTE *fileData); /**
* 擦除文件
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
* @see
* @note
*/
UINT EraseFile(UINT fileNameLen, BYTE *fileName);
#endif
HandleFile.c
#include "HandleFile.h"
#include "RetCode.h"
#include "AddrDefine.h" /**
* 读取文件
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @param[in] dataLen 数据长度
* @param[out] fileData 输出数据
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
* @see
* @note
*/
UINT ReadFile(UINT fileNameLen, BYTE *fileName, UINT dataLen, BYTE *fileData)
{
return SUCCESS;
} /**
* 写入文件
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @param[out] fileData 输出数据
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
* @see
* @note
*/
UINT WriteFile(UINT fileNameLen, BYTE *fileName, BYTE *fileData)
{
return SUCCESS;
} /**
* 擦除文件
* @param[in] fileNameLen 文件名长度
* @param[in] fileName 文件名
* @return 0,执行成功,非0,失败,详见
* @ref RetCode.h
* @see
* @note
*/
UINT EraseFile(UINT fileNameLen, BYTE *fileName)
{
return SUCCESS;
}
main.c
#include "DoxygenFile.h"
#include "CommonType.h" /**
* @mainpage Doxygen工程演示
* @section 介绍
* 1、本工程使用了5个头文件
* @ref AddrDefine.h
* @ref CommonType.h
* @ref DoxygenFile.h
* @ref HandleFile.h
* @ref RetCode.h \n
* 2、生成本工程,需安装Doxygen、htmlhelp、GraphViz三个软件
*/ void main()
{
HandleData(,NULL,NULL);
}
3、利用Doxygen工具将注释转换成API文档
接下来,就是利用Doxygen工具将DoxygenTest工程中注释提取出来,转换成chm格式的API文档。第三部分分成九步:1、工程配置;2、模式配置;3、输出配置;4、调用图配置;5、字符集配置;6、输入字符集配置;7、chm配置;8、Grapviz配置;9、执行Doxygen。
1、工程配置;

2、模式配置;

3、输出配置;

4、调用图配置;

5、字符集配置;

6、输入字符集配置;

7、chm配置;

8、Grapviz配置;

9、执行Doxygen

完成上述操作之后,就能生成如下API文档

参考资料
1、Doxygen配置以及注释详细说明文档:doxygen_manual-1.8.9.1.pdf
Doxygen给C程序生成注释文档的更多相关文章
- 使用doxygen生成注释文档
1. doxygen下载地址:http://www.stack.nl/~dimitri/doxygen/ 2. 参考http://wenku.baidu.com/link?url=ETvBUyaR9f ...
- [Dynamic Language] 用Sphinx自动生成python代码注释文档
用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ...
- 利用JSDOC快速生成注释文档,非常棒。
有时往往我们需要建一个文档来记录js中的一些代码注释,比如一些公共的函数,又或者一些类,在团队合作中,文档接口也是必不可少的,传统的方式多少有些不便,这里介绍一个工具,它叫JSDOC,它可以用来将注释 ...
- VS2010 生成Xml格式的注释文档
项目, 属性, build, 勾选xml document file, 重新build, 即可生成xml注释文件, 然后还得找工具软件(看到anytao推荐SandCastle) 生成更易读的帮助文档 ...
- 在eclipse中生成html注释文档
生成api文档 文档注释/** 1.描述 2.@author 作者 @version 版本 3.@param 参数 @return 返回值的含义 @throws 抛出异常描述 @deprecated ...
- Xcode 利用VVDocumenter 生成注释 通过设置 再生成注释文档
在写代码的时候,如果按照一定的规范在头文件里写上注释的话, 就可以利用Xcode的文档自动输出功能生成一份完整的HTML项目文档. 生成的格式和Apple Developer网站上的API文档几乎是一 ...
- Android Studio javadoc 生成注释文档
相信大家刚开始写代码的时候就被前辈告知了要养成写注释的好习惯,今天我们来了解一下如何利用我们平时写的注释生成文档,一起来看看吧! 其实注释格式一般如下两种: /* *普通多行 *注释 */ / ...
- 使用doxygen为C/C++程序生成中文文档
文章来自:http://www.fmddlmyy.cn/text21.html 依照约定的格式凝视源码,用工具处理凝视过的源码产生文档.通过这样的方式产生文档至少有下面优点: 便于代码和文档保持同步. ...
- 用doxygen+graphviz自动化生成代码文档(附详细教程)
一.引子 用这两个工具可以自动的遍历代码,并且产生代码文档,我们先来看看效果,然后放出这两个工具的下载地址. 二.工具的下载地址 doxygen:http://www.stack.nl/~dimitr ...
随机推荐
- svm损失函数
作者:杜客链接:https://zhuanlan.zhihu.com/p/20945670来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. SVM的损失函数定义如下: 举 ...
- 今天我看了一个H5游戏EUI的例子,我都快分不清我到底是在用什么语言编译了代码了,作为刚刚学习H5游戏开发的菜鸟只能默默的收集知识
今天看了一个EUI的demo,也是接触H5游戏开发的第五天了,我想看看我能不能做点什么出来,哎,自己写果然还是有问题的.在看EUI哪一个demo的时候就遇见了一些摇摆不定的问题,我觉得提出来 1.to ...
- UVa 712 S树
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- springMVC 返回json 忽略类中属性的注解
该注解使用在 类名,接口头上 @JsonIgnoreProperties(value={"comid"}) //希望动态过滤掉的属性 该注解使用在get方法头上 @JsonIgno ...
- python built-in zip()
zip([iterable, ...]) 返回一个list ,list里的元素是元组tuple.第i个元组内的元素是所有iteralbe中第i个元素组成的. 当所有的iterable拥有同样的长度的时 ...
- IIs安装&发布&解决遇到的问题
IIS安装: IIS发布: 1.添加网站: 2.将发布的文件,copy到该网站的目录下 3. 刷新,文件显示出来,将其"转换为应用程序” => 4.在应用程序池中找到该网站相应的程序池 ...
- bash while/until循环学习
while循环:条件满足,则循环:失败,则退出 如何退出? 必须有时刻,条件测试不成功 ? :条件控制变量 while 条件测试:do 循环体 done until循环:条件不满足,则循环:否则,退出 ...
- Struts2向值栈中压入属性的方式
Struts2在初始化Action的时候会先向值栈中压入一个action对象,里面包含了各个属性,这些属性是怎么被压进去的?或者说是根据什么来压入的?直到2016年5月5日才理解,原来是在初始化act ...
- js调用页面打印
----------------------调用页面打印-------------------------------- <body> <div id="divPrint& ...
- SQLAlchemy 几种查询方式总结
转自:http://blog.csdn.net/shudaqi2010/article/details/51568219 几种常见sqlalchemy查询:#简单查询 print(session ...