近段时间,一直在学习华为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

  2、C++ 程序文档生成器介绍(doxygen)

  3、使用doxygen生成chm范例

  4、嵌入式C语言中的Doxygen注释模板

  5、Doxygen使用简介

Doxygen给C程序生成注释文档的更多相关文章

  1. 使用doxygen生成注释文档

    1. doxygen下载地址:http://www.stack.nl/~dimitri/doxygen/ 2. 参考http://wenku.baidu.com/link?url=ETvBUyaR9f ...

  2. [Dynamic Language] 用Sphinx自动生成python代码注释文档

    用Sphinx自动生成python代码注释文档 pip install -U sphinx 安装好了之后,对Python代码的文档,一般使用sphinx-apidoc来自动生成:查看帮助mac-abe ...

  3. 利用JSDOC快速生成注释文档,非常棒。

    有时往往我们需要建一个文档来记录js中的一些代码注释,比如一些公共的函数,又或者一些类,在团队合作中,文档接口也是必不可少的,传统的方式多少有些不便,这里介绍一个工具,它叫JSDOC,它可以用来将注释 ...

  4. VS2010 生成Xml格式的注释文档

    项目, 属性, build, 勾选xml document file, 重新build, 即可生成xml注释文件, 然后还得找工具软件(看到anytao推荐SandCastle) 生成更易读的帮助文档 ...

  5. 在eclipse中生成html注释文档

    生成api文档 文档注释/** 1.描述 2.@author 作者 @version 版本 3.@param 参数 @return 返回值的含义 @throws 抛出异常描述 @deprecated ...

  6. Xcode 利用VVDocumenter 生成注释 通过设置 再生成注释文档

    在写代码的时候,如果按照一定的规范在头文件里写上注释的话, 就可以利用Xcode的文档自动输出功能生成一份完整的HTML项目文档. 生成的格式和Apple Developer网站上的API文档几乎是一 ...

  7. Android Studio javadoc 生成注释文档

    相信大家刚开始写代码的时候就被前辈告知了要养成写注释的好习惯,今天我们来了解一下如何利用我们平时写的注释生成文档,一起来看看吧! 其实注释格式一般如下两种:  /*  *普通多行  *注释  */ / ...

  8. 使用doxygen为C/C++程序生成中文文档

    文章来自:http://www.fmddlmyy.cn/text21.html 依照约定的格式凝视源码,用工具处理凝视过的源码产生文档.通过这样的方式产生文档至少有下面优点: 便于代码和文档保持同步. ...

  9. 用doxygen+graphviz自动化生成代码文档(附详细教程)

    一.引子 用这两个工具可以自动的遍历代码,并且产生代码文档,我们先来看看效果,然后放出这两个工具的下载地址. 二.工具的下载地址 doxygen:http://www.stack.nl/~dimitr ...

随机推荐

  1. 工作记事 unknownHost

    使用xutils框架   下带图片(文件)事解析时在urlconnection  执行connect操作的时候抛出 UnknownHostException 而浏览器中能够正常访问该地址.这是由于该u ...

  2. Html菜鸡大杂烩

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. 详解java方法的重载

    1.方法的重载: 方法名相同,参数列表不同就叫做方法的重载.

  4. 《C#编程宝典:十年典藏版》阅读笔记(1)

    1.运行时错误,使用Checked块语句进行异常检查与抛出异常. 2.值类型使用线程堆栈保存数据,数据大小大概为1M左右,引用类型使用托管堆保存数据,可以无限分配空间,因为有一个GC垃圾回收机制存在, ...

  5. 解决 502、504 Gateway Time-out(nginx)

    一.504 Gateway Time-out问题常见于使用nginx作为web server的服务器的网站 我遇到这个问题是在升级discuz论坛的时候遇到的 一般看来, 这种情况可能是由于nginx ...

  6. c#大数加法

    在C#中,我们经常需要表示整数.但是,c#的基本数据类型中,最大的long也只能表示-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807之间的数 ...

  7. 解决Spine骨骼混合动画错乱问题

    Spine是一个很好的制作2D骨骼动画的软件,其中提供的混合(mix)动画功能可以很柔和过度两个不同的动画,但在混合时期,稍有不善,非常容易出现各种错乱.在Spine2D骨骼动画群上,有人提出全K帧. ...

  8. java 自动登录代码

    javaBean的代码    package bean;    import java.io.Serializable;    public class Admin implements Serial ...

  9. jQuery实例——jQuery实现联动下拉列表查询框--转http://www.cnblogs.com/picaso/archive/2012/04/08/2437442.html#undefined

    jQuery实例--jQuery实现联动下拉列表查询框   在查询与列表显示的时候经常用到联动列表显示,比如一级选项是国家,二级选项是省,三级是市,这样的联动是联系的实时导出的,比如你不可能选择了四川 ...

  10. 基于XML的AOP配置-转

    http://www.cnblogs.com/yangy608/archive/2010/11/14/1876839.html AOP(Aspect-Oriented Programming,面向切面 ...