近段时间,一直在学习华为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. SQL中跨服务器查询

    1.跨库查询 select * from [库名].dbo.表名 2.跨库查询 select * from OPENDATASOURCE('SQLOLEDB','Data Source=服务器名或IP ...

  2. 开启Java博客

    已经转Java大半年了,Java知识都来自于工作,没有一个系统的学习,所以这一个多月我都在看Java的一些基本东西,准备系统性的学习下Java知识.这一个多月看的也挺多,从servlet,jsp,st ...

  3. 防止sql注入

    sqlmap 较专业的sql注入工具YII2  activeform   注意传过来的modle的rules规则 <?php$form=\yii\widgets\ActiveForm::begi ...

  4. 11.14 T2 小x的旅行(小x的旅行)

    1.小x的旅行   (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...

  5. Spring使用ThreadLocal技术来处理这些问题

    过去我习惯于从左到右的思考,因为这符合书写的习惯,对于“好”得前端工程师,我们首先可能会去思考什么是好,好的定义和范围,标准和要求?但现在我习惯于从右到左的思考,因为我觉得越是抽象越难以定义,从粒度更 ...

  6. NOIp 2011 mayan游戏 搜索

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  7. Torch 日志文件的保存 logroll

    Torch 日志文件的保存 logroll 怎样将 Torch 在终端显示的信息,保存到 log 文件中 ?   现在介绍一种方法:利用 logroll 的方式.  参考 https://github ...

  8. Servlet,jsp,JSP技术 ,JSP编程

     一.Servlet 思考 1 浏览器可以直接打开JAVA/class文件吗? 不可以 2浏览器可以打开HTML.JS 文件吗? 可以 3 JAVA程序可以生成HTML文件吗?可以的,用IO流. 4 ...

  9. 新增了个job

    https://112.124.41.113/svn/wbhpro/wbh-adapter-job

  10. lnmp平台菜鸟入门级笔记

                  LNMP平台搭建 Mysql安装  MySQL安装 回复收藏  分享    1 下载MySQL数据库l到/usr/local/src/[root@xin tmp]# cd ...