Linux下Doxgen的安装与使用

Linux下Doxgen的安装与使用


一、安装

1、网络安装

直接执行sudo apt-get install doxgen

2、压缩包安装

官网下载doxygen-1.8.18.linux.bin.tar.gz压缩包,通过软件上传压缩包到Linux系统后,执行以下命令:

sudo tar xvfz doxygen-1.8.18.linux.bin.tar.gz
cd doxygen-1.8.18/
./configure
make
sudo make install

二、使用

针对C语言语法,也适用于C++

1、注释

  1. 头文件注释
/** @brief   摘要
 *  @file    文件名
 *  @author  作者
 *  @version 版本
 *  @date    日期
 *  @note    注解. 例如: 本文件有什么具体功能啊, 使用时要注意什么啊..
 *  @since   自从...
 */
  1. 函数注释
/**  函数的概述
 * @param[in]  输入参数1
 * @param[in]  输入参数2
 * @param[out] 输出参数1
 * @return     返回值解释一下
 * @warning    警告: 例如: 参数不能为空之类的
 * @note       注解
 * @see        类似于请参考xxoo函数之类的
 * @todo       可描述算法比较好
 * @exception  函数抛出异常
 */

返回值也可以这样写:

@retval 1 成功
@retval 0 失败
  1. 块注释模板
/*---第一种(比较常用)---*/
/**
 * ... text ...
 */

/*---第二种(比较常用)---*/
/*!
 * ... text ...
 */
 
/*---第三种(比较显眼)---*/
/********************************************//**
 * ... text
 ***********************************************/

/*---第四种(比较显眼)---*/
/************************************************
 * ... text
 ***********************************************/
  1. 变量注释注释
/*---第一种(详细描述)---*/
int var; /**< Detailed description after the member */

/*---第二种(简要描述)---*/
int var; //!< Brief description after the member

/*---第三种(简要描述)---*/
int var; ///< Brief description after the member
  1. 常用关键字
@author     作者的信息
@brief      用于class 或function的简易说明 eg:@brief 本函数负责打印错误信息串
@bug        被标记的代码会在Bug列表中出现
@class      类名
@date       日期
@file       文件名,可以默认为空,DoxyGen会自己加
@param      主要用于函数说明中,后面接参数的名字,然后再接关于该参数的说明
@return     描述该函数的返回值情况eg: @return 本函数返回执行结果,若成功则返回TRUE,否则返回FLASE
@retval     描述返回值类型 eg: @retval NULL 空字符串。@retval !NULL 非空字符串。
@note       注解
@attention  注意
@name       分组名
@warning    警告信息
@enum       引用了某个枚举,Doxygen会在该枚举处产生一个链接 eg:@enum CTest::MyEnum
@var        引用了某个变量,Doxygen会在该枚举处产生一个链接 eg:@var CTest::m_FileKey
@class      引用某个类,格式:@class <name> [<header-file>] [<header-name>] eg:@class CTest "inc/class.h"
@exception  可能产生的异常描述 eg: @exception 本函数执行可能会产生超出范围的异常
@todo       对将要做的事情进行注释
@see        see also字段
@relates <name> 通常用做把非成员函数的注释文档包含在类的说明文档中。
@since      从哪个版本后开始有这个函数的
@code       在注释中开始说明一段代码,直到@endcode命令。
@endcode    在注释中代码段的结束。
@remarks    备注
@pre        用来说明代码项的前提条件。
@post       用来说明代码项之后的使用条件。
@deprecated 这个函数可能会在将来的版本中取消。
@defgroup   模块名
@{          模块开始
@}          模块结束
@class      声明一个类 
@version    版本号
@fn         声明一个函数
@par        开始一个段落,段落名称描述由你自己指定,比如可以写一段示例代码
-           一级项目符号
-#          二级项目符号

2、配置文件与说明文件的生成

2.1 采用官方默认配置文件

安装好Doxgen后,在需要生成说明文件的工程目录中

  1. 执行doxgen -g,此时会在该目录下生成Doxyfile默认配置文件(具体代码如下所示);
  2. 执行doxgen,此时会按照配置文件中的信息生成说明文件(html、latex格式);
  3. 执行firefox +所在目录/index.html,此时就会打开说明文件的html版本
2.2 自定义配置文件

根据官方的说明文档自己编写配置参数,下面的配置文件是比较通用的(出自:https://gitee.com/langcai1943/embedded_programming_skills/tree/develop/

  1. 假设自定义配置文件名为Doxyfile1,则生成说明文件执行doxgen Doxyfile1
    doxgen + 自定义配置文件名

  2. 执行firefox +所在目录/index.html,此时就会打开说明文件的html版本

  • 使用中常修改的参数
# 生成文档的标题首页名称
PROJECT_NAME           = "标题名"

# 文档版本号
PROJECT_NUMBER         = "版本数字"

# 生成文档的路径,为相对路径
# out/表示:当前配置文件所在目录的out目录
OUTPUT_DIRECTORY       = out/

# 输出文档的语言,可以选择多种,具体可以参考官方文档
OUTPUT_LANGUAGE        = Chinese

# 如果是制作 C 程序文档,该选项必须设为 YES,否则默认生成 C++ 文档格式
OPTIMIZE_OUTPUT_FOR_C  = YES

# 对于使用 typedef 定义的结构体、枚举、联合等数据类型,只按照 typedef 定义的类型名进行文档化
TYPEDEF_HIDES_STRUCT   = YES

# 把这个标记设置为 Yes。否则,文档不包含文件的静态成员(函数和变量)。
EXTRACT_STATIC         = YES

############################################
# 当需要指定文件生成说明文件
# 1、指定文件
#	设置FILE_PATTERNS = 指定文件名
# 2、指定所在目录文件
#   INPUT  = 目录名
#	FILE_PATTERNS = 指定文件名
############################################

# 在这里,doxygen 会从这两个目录读取 C/C++ 源代码。
# 如果项目只有一个源代码根目录,其中有多个子目录,那么只需指定根目录并把 <RECURSIVE> 标记设置为 Yes。
# 可以指定目录
INPUT                  = ./

# 输入文件的编码格式
INPUT_ENCODING         = UTF-8

# 默认搜索的文件名,搜索指定文件可以在此输入文件名
FILE_PATTERNS          = *.c \
  • 通用的配置文件
# 字符集编码
DOXYFILE_ENCODING      = UTF-8

# 生成文档的标题首页名称
PROJECT_NAME           = "Embedded Programming Skills"

# 文档版本号
PROJECT_NUMBER         = "0.0.1"

# 文档描述
PROJECT_BRIEF          =

# LOGO
PROJECT_LOGO           =

# 生成文档的路径
OUTPUT_DIRECTORY       = out/

# 创建子文件夹
CREATE_SUBDIRS         = NO

# 允许用非ASCII码为文件命名
ALLOW_UNICODE_NAMES    = NO

# 输出文档的语言
OUTPUT_LANGUAGE        = Chinese

# 文本方向
# information to generate all generated output in the proper direction.
# Possible values are: None, LTR, RTL and Context.
# The default value is: None.
OUTPUT_TEXT_DIRECTION  = None

# 包含brief描述信息
BRIEF_MEMBER_DESC      = YES

# 包含brief描述信息
REPEAT_BRIEF           = YES

ABBREVIATE_BRIEF       = "The $name class" \
                         "The $name widget" \
                         "The $name file" \
                         is \
                         provides \
                         specifies \
                         contains \
                         represents \
                         a \
                         an \
                         the

ALWAYS_DETAILED_SEC    = NO

INLINE_INHERITED_MEMB  = NO

FULL_PATH_NAMES        = YES

STRIP_FROM_PATH        =

STRIP_FROM_INC_PATH    =

SHORT_NAMES            = NO

JAVADOC_AUTOBRIEF      = NO

JAVADOC_BANNER         = NO

QT_AUTOBRIEF           = NO

MULTILINE_CPP_IS_BRIEF = NO

INHERIT_DOCS           = YES

SEPARATE_MEMBER_PAGES  = NO

# 每个tab占几个字节的宽度
TAB_SIZE               = 4

ALIASES                =

# 是否生成C语言格式的文档(否则生成C++格式的)
OPTIMIZE_OUTPUT_FOR_C  = YES
OPTIMIZE_OUTPUT_JAVA   = NO
OPTIMIZE_FOR_FORTRAN   = NO
OPTIMIZE_OUTPUT_VHDL   = NO
OPTIMIZE_OUTPUT_SLICE  = NO

EXTENSION_MAPPING      =

MARKDOWN_SUPPORT       = YES

TOC_INCLUDE_HEADINGS   = 5

AUTOLINK_SUPPORT       = YES

BUILTIN_STL_SUPPORT    = NO

CPP_CLI_SUPPORT        = NO

SIP_SUPPORT            = NO

IDL_PROPERTY_SUPPORT   = YES

DISTRIBUTE_GROUP_DOC   = NO

GROUP_NESTED_COMPOUNDS = NO

SUBGROUPING            = YES

INLINE_GROUPED_CLASSES = NO

INLINE_SIMPLE_STRUCTS  = NO

# 对于使用 typedef 定义的结构体、枚举、联合等数据类型,只按照 typedef 定义的类型名进行文档化
TYPEDEF_HIDES_STRUCT   = YES

LOOKUP_CACHE_SIZE      = 0

# 这个标记告诉 doxygen,即使各个类或函数没有文档,也要提取信息。必须把这个标记设置为 Yes。
EXTRACT_ALL            = YES

# 把这个标记设置为 Yes。否则,文档不包含类的私有数据成员
EXTRACT_PRIVATE        = YES

EXTRACT_PRIV_VIRTUAL   = NO

EXTRACT_PACKAGE        = NO

# 把这个标记设置为 Yes。否则,文档不包含文件的静态成员(函数和变量)。
EXTRACT_STATIC         = YES

EXTRACT_LOCAL_CLASSES  = YES

EXTRACT_LOCAL_METHODS  = NO

EXTRACT_ANON_NSPACES   = NO

HIDE_UNDOC_MEMBERS     = NO

HIDE_UNDOC_CLASSES     = NO

HIDE_FRIEND_COMPOUNDS  = NO

HIDE_IN_BODY_DOCS      = NO

INTERNAL_DOCS          = NO

CASE_SENSE_NAMES       = YES

# 由于 C 语言没有所谓的域/名字空间这样的概念,所以此处设置为 YES
HIDE_SCOPE_NAMES       = YES

HIDE_COMPOUND_REFERENCE= NO

SHOW_INCLUDE_FILES     = YES

SHOW_GROUPED_MEMB_INC  = NO

FORCE_LOCAL_INCLUDES   = NO

INLINE_INFO            = YES

SORT_MEMBER_DOCS       = YES

SORT_BRIEF_DOCS        = NO

SORT_MEMBERS_CTORS_1ST = NO

SORT_GROUP_NAMES       = NO

SORT_BY_SCOPE_NAME     = NO

STRICT_PROTO_MATCHING  = NO

GENERATE_TODOLIST      = YES

GENERATE_TESTLIST      = YES

GENERATE_BUGLIST       = YES

GENERATE_DEPRECATEDLIST= YES

ENABLED_SECTIONS       =

MAX_INITIALIZER_LINES  = 30

SHOW_USED_FILES        = YES

SHOW_FILES             = YES


SHOW_NAMESPACES        = YES

FILE_VERSION_FILTER    =

LAYOUT_FILE            =

CITE_BIB_FILES         =

# 生成文档时只输出错误信息
QUIET                  = NO

WARNINGS               = YES

WARN_IF_UNDOCUMENTED   = YES

WARN_IF_DOC_ERROR      = YES

WARN_NO_PARAMDOC       = NO

WARN_AS_ERROR          = NO

WARN_FORMAT            = "$file:$line: $text"

WARN_LOGFILE           =

# 在这里,doxygen 会从这两个目录读取 C/C++ 源代码。
# 如果项目只有一个源代码根目录,其中有多个子目录,那么只需指定根目录并把 <RECURSIVE> 标记设置为 Yes。
# 可以指定目录
INPUT                  = ./

# 输入文件的编码格式
INPUT_ENCODING         = UTF-8

# 默认搜索的文件名,搜索指定文件可以在此输入文件名
FILE_PATTERNS          = *.c \
                         *.cc \
                         *.cxx \
                         *.cpp \
                         *.c++ \
                         *.java \
                         *.ii \
                         *.ixx \
                         *.ipp \
                         *.i++ \
                         *.inl \
                         *.idl \
                         *.ddl \
                         *.odl \
                         *.h \
                         *.hh \
                         *.hxx \
                         *.hpp \
                         *.h++ \
                         *.cs \
                         *.d \
                         *.php \
                         *.php4 \
                         *.php5 \
                         *.phtml \
                         *.inc \
                         *.m \
                         *.markdown \
                         *.md \
                         *.mm \
                         *.dox \
                         *.doc \
                         *.txt \
                         *.py \
                         *.pyw \
                         *.f90 \
                         *.f95 \
                         *.f03 \
                         *.f08 \
                         *.f18 \
                         *.f \
                         *.for \
                         *.vhd \
                         *.vhdl \
                         *.ucf \
                         *.qsf \
                         *.ice

# 遍历子目录,寻找原文件
RECURSIVE              = YES

EXCLUDE                =

EXCLUDE_SYMLINKS       = NO

EXCLUDE_PATTERNS       =

EXCLUDE_SYMBOLS        =

# 示例程序路径
EXAMPLE_PATH           = 01_src/example/

# 示例程序的头文档 (.h 文件) 与实现文档 (.c 文件) 都作为程序文档化对象,为空
EXAMPLE_PATTERNS       = *

# 递归遍历示例程序目录的子目录,寻找被文档化的程序源文件
EXAMPLE_RECURSIVE      = YES

IMAGE_PATH             =

INPUT_FILTER           =

FILTER_PATTERNS        =

FILTER_SOURCE_FILES    = NO

FILTER_SOURCE_PATTERNS =

USE_MDFILE_AS_MAINPAGE =

# 在最后生成的文档中,把所有的源代码src包含在其中
SOURCE_BROWSER         = NO

INLINE_SOURCES         = NO

STRIP_CODE_COMMENTS    = YES

# 允许程序文档中显示本文档化的函数相互调用关系
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION    = YES
REFERENCES_LINK_SOURCE = YES

SOURCE_TOOLTIPS        = YES

USE_HTAGS              = NO

VERBATIM_HEADERS       = YES

ALPHABETICAL_INDEX     = YES

COLS_IN_ALPHA_INDEX    = 5

IGNORE_PREFIX          =

GENERATE_HTML          = YES

HTML_OUTPUT            = html

HTML_FILE_EXTENSION    = .html

HTML_HEADER            =

HTML_FOOTER            =

HTML_STYLESHEET        =

HTML_EXTRA_STYLESHEET  =

HTML_EXTRA_FILES       =

HTML_COLORSTYLE_HUE    = 220

HTML_COLORSTYLE_SAT    = 100

HTML_COLORSTYLE_GAMMA  = 80

HTML_TIMESTAMP         = NO

HTML_DYNAMIC_MENUS     = YES

HTML_DYNAMIC_SECTIONS  = NO

HTML_INDEX_NUM_ENTRIES = 100

GENERATE_DOCSET        = NO

DOCSET_FEEDNAME        = "Doxygen generated docs"

DOCSET_BUNDLE_ID       = org.doxygen.Project

DOCSET_PUBLISHER_ID    = org.doxygen.Publisher

DOCSET_PUBLISHER_NAME  = Publisher

GENERATE_HTMLHELP      = NO

CHM_FILE               =

HHC_LOCATION           =

GENERATE_CHI           = NO

CHM_INDEX_ENCODING     =

BINARY_TOC             = NO

TOC_EXPAND             = NO

GENERATE_QHP           = NO

QCH_FILE               =

QHP_NAMESPACE          = org.doxygen.Project

QHP_VIRTUAL_FOLDER     = doc

QHP_CUST_FILTER_NAME   =

QHP_CUST_FILTER_ATTRS  =

QHP_SECT_FILTER_ATTRS  =

QHG_LOCATION           =

GENERATE_ECLIPSEHELP   = NO

ECLIPSE_DOC_ID         = org.doxygen.Project

DISABLE_INDEX          = NO

# 这会在HTML文档中,添加一个侧边栏,并以树状结构显示包、类、接口等的关系
GENERATE_TREEVIEW      = ALL

ENUM_VALUES_PER_LINE   = 4

TREEVIEW_WIDTH         = 250

EXT_LINKS_IN_WINDOW    = NO

HTML_FORMULA_FORMAT    = png

FORMULA_FONTSIZE       = 10

FORMULA_TRANSPARENT    = YES

FORMULA_MACROFILE      =

USE_MATHJAX            = NO

MATHJAX_FORMAT         = HTML-CSS

MATHJAX_RELPATH        = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/

MATHJAX_EXTENSIONS     =

MATHJAX_CODEFILE       =

SEARCHENGINE           = YES

SERVER_BASED_SEARCH    = NO

EXTERNAL_SEARCH        = NO

SEARCHENGINE_URL       =

SEARCHDATA_FILE        = searchdata.xml

EXTERNAL_SEARCH_ID     =

EXTRA_SEARCH_MAPPINGS  =

GENERATE_LATEX         = YES

LATEX_OUTPUT           = latex

LATEX_CMD_NAME         =

MAKEINDEX_CMD_NAME     = makeindex

LATEX_MAKEINDEX_CMD    = makeindex

COMPACT_LATEX          = NO

PAPER_TYPE             = a4

EXTRA_PACKAGES         =

LATEX_HEADER           =

LATEX_FOOTER           =

LATEX_EXTRA_STYLESHEET =

LATEX_EXTRA_FILES      =

PDF_HYPERLINKS         = YES

USE_PDFLATEX           = YES

LATEX_BATCHMODE        = NO

LATEX_HIDE_INDICES     = NO

LATEX_SOURCE_CODE      = NO

LATEX_BIB_STYLE        = plain

LATEX_TIMESTAMP        = NO

LATEX_EMOJI_DIRECTORY  =

GENERATE_RTF           = NO

RTF_OUTPUT             = rtf

COMPACT_RTF            = NO

RTF_HYPERLINKS         = NO

RTF_STYLESHEET_FILE    =

RTF_EXTENSIONS_FILE    =

RTF_SOURCE_CODE        = NO

GENERATE_MAN           = NO

MAN_OUTPUT             = man

MAN_EXTENSION          = .3

MAN_SUBDIR             =

MAN_LINKS              = NO

GENERATE_XML           = NO

XML_OUTPUT             = xml

XML_PROGRAMLISTING     = YES

XML_NS_MEMB_FILE_SCOPE = NO

GENERATE_DOCBOOK       = NO

DOCBOOK_OUTPUT         = docbook

DOCBOOK_PROGRAMLISTING = NO

GENERATE_AUTOGEN_DEF   = NO

GENERATE_PERLMOD       = NO

PERLMOD_LATEX          = NO

PERLMOD_PRETTY         = YES

PERLMOD_MAKEVAR_PREFIX =

ENABLE_PREPROCESSING   = YES

MACRO_EXPANSION        = NO

EXPAND_ONLY_PREDEF     = NO

SEARCH_INCLUDES        = YES

INCLUDE_PATH           =

INCLUDE_FILE_PATTERNS  =

PREDEFINED             =

EXPAND_AS_DEFINED      =

SKIP_FUNCTION_MACROS   = YES

TAGFILES               =

GENERATE_TAGFILE       =

ALLEXTERNALS           = NO

EXTERNAL_GROUPS        = YES

EXTERNAL_PAGES         = YES

CLASS_DIAGRAMS         = YES

DIA_PATH               =

HIDE_UNDOC_RELATIONS   = YES

# 在程序文档中允许以图例形式显示函数调用关系,前提是你已经安装了 graphviz 软件包
HAVE_DOT               = YES

DOT_NUM_THREADS        = 0

DOT_FONTNAME           = Helvetica

DOT_FONTSIZE           = 10

DOT_FONTPATH           =

CLASS_GRAPH            = YES

COLLABORATION_GRAPH    = YES

GROUP_GRAPHS           = YES

# 在程序文档中允许以图例形式显示函数调用关系,前提是你已经安装了 graphviz 软件包
UML_LOOK               = YES

UML_LIMIT_NUM_FIELDS   = 10

TEMPLATE_RELATIONS     = NO

INCLUDE_GRAPH          = YES

INCLUDED_BY_GRAPH      = YES

# 在程序文档中允许以图例形式显示函数调用关系,前提是你已经安装了 graphviz 软件包
CALL_GRAPH             = YES
CALLER_GRAPH           = YES

GRAPHICAL_HIERARCHY    = YES

DIRECTORY_GRAPH        = YES

DOT_IMAGE_FORMAT       = png

INTERACTIVE_SVG        = NO

DOT_PATH               =

DOTFILE_DIRS           =

MSCFILE_DIRS           =

DIAFILE_DIRS           =

PLANTUML_JAR_PATH      =

PLANTUML_CFG_FILE      =

PLANTUML_INCLUDE_PATH  =

DOT_GRAPH_MAX_NODES    = 50

MAX_DOT_GRAPH_DEPTH    = 0

DOT_TRANSPARENT        = NO

DOT_MULTI_TARGETS      = NO

GENERATE_LEGEND        = YES

DOT_CLEANUP            = YES

三、实践

/*******************************************************************************
 * Copyleft (c) 2020 将狼才鲸
 *
 * 版权描述信息略
 * 每个.c文件都要包含文件头注释信息
 *
 * @file    main.c
 * @brief   整个程序的入口
 * @author  将狼才鲸
 * @version 0.0.1
 * @date    2020-03-29
 * @license MulanPSL-1.0
 *
 * -----------------------------------------------------------------------------
 * 备注:一切从main开始,这一次主要展示注释规范
 * 文件头注释块开始和结束的*星号为80个字符宽,一是为了给代码换行做参考,代码尽量
 * 不要超过80个字符,除非遇到不能换行的字符串常量;二也是为了美观
 *
 * 参考资料:
 * 《Doxygen注释规范》
 * https://blog.csdn.net/qq_25779555/article/details/77737391
 *
 * -----------------------------------------------------------------------------
 * 文件修改历史:
 * <时间>       | <版本>    | <作者>    | <描述>
 * 2020-03-29   | v0.0.1    | 将狼才鲸  | 创建文件
 * -----------------------------------------------------------------------------
 ******************************************************************************/

/*=============================== 头文件包含 =================================*/
# include <stdio.h>

/*============================= 结构体联合体定义 =============================*/
/*!
 * 1、结构体和联合体都需要用typedef重定义
 * 2、原结构体/联合体命名用下划线+小驼峰命名法,
 *    加下划线是为了避免不经意间和其它全局变量发生冲突,重定义后的名字用全大写
 *    +下划线的方式,和宏定义的命名类似
 * 3、结构体/联合体定义时起始大括号放在行末,结束大括号放在行首,大括号和名称
 *    之间留一个空格
 */
typedef struct _optInfo {
    int opt;        /**< 每个结构体/联合体成员都要有注释 */
    char *pInfo;    /**< 程序传入的字符串参数 */
} OPT_INFO_S;   /**< 行尾注释用tab缩进,至少和要注释的元素留有一个空格 */

/*!
 * main函数参数的操作类型
 */
typedef enum _opt {
    OPT_NUMBER,     /**< 第一个enum如果不赋值则默认赋值0,占一个int的空间 */
    OPT_STRING = 1, /**< 之后的元素如果不赋值,则值自动加1 */
    OPT_NOTICY      /**< 最后一个元素结尾不要加逗号 */
} OPT_U;        /**< main函数参数的操作类型 */

/*============================= 宏定义/重定义 ================================*/
#define pr_info printf

#define MAX_NUM (5)     /**< main函数最多支持的参数个数 */
#define MIN_NUM (1)     /**< main函数最少需要的参数个数 */

#define ERR_PARAM (-1)  /**< 错误码:参数错误 */
#define ERR_OPTION (-2) /**< 错误码:操作错误 */

/*================================ 全局变量 ==================================*/
int g_curNum = 0;   /**< 当前的main函数参数个数 */

/*!
 * 不同的代码块之间,两个函数之间,都只空一行,不要空两行或以上
 */

/*================================ 接口函数 ==================================*/
/*******************************************************************************
 * @brief   主函数入口
 *          函数不同参数之间要有一个空格,且空格在逗号后面
 *          指针的*星号靠近变量名,而不是靠近类型名;函数命名使用小写+下划线的
 *          方式,如get_info(),不要使用驼峰命名法,如getInfo()或者GetInfo()
 *
 * @param   [in]argc    运行可执行程序时后面带的参数个数(其中第0个参数默认
 *              是程序的全名),[in]代表的是输出参数,[out]代表是输出参数
 *              [in out]代表既是输入又是输出参数
 *          [in]argv    字符串指针数组,程序执行传入的参数都是字符串形式,
 *              即使传入的是数字
 * @return  0代表返回成功,负数代表返回错误码
 ******************************************************************************/
int main(int argc, char *argv[])
{
    int i;
    /*!
     * 1、变量名不要使用中文拼音,不要一行定义多个变量,如int i, j, k ,tmp;
     * 2、不要使用无意义的单个字母或同一个字母叠写,如int a; int aaa; 但用在for
     *    或者while循环内的局部循环变量i、j、k是允许的
     * 3、不要使用不常用的缩写,如fui、pfa,而tmp、isr、fd、xmt、tx、rx等这些
     *    约定俗成的除外;变量命名使用小驼峰命名法或者匈牙利命名法
     *    (小写属性+下划线+小驼峰命名法)
     *    不要使用大驼峰命名法(帕斯卡命名法)或者全小写/全大写+下划线的
     *    命名方法
     */
    int opt;                /**< 同一块注释尽量保持对齐 */
    char *p_noticeInfo;     /**< 匈牙利命名法,具体的属性代号可上网搜索 */

    /*! 变量定义和实际处理代码之间要留一个空行 */
    /*! 注释使用斜杠星号星号斜杠的方式,不要使用两斜杠 */
    /*! 注释与两边的星号斜杠间要各留一个空格,注释末尾不用添加句号 */

    /*! 每个函数的第一件事要对所有输入参数要做参数检查 */
    /*!
     * 1、if else while等关键字与后面小括号留一个空格,不允许if()
     * 2、+ - = ==等双目操作符两边必须留一个空格,不允许int i=0;
     * 3、小括号里面不要和表达式留有空格,不允许if ( a < 0 )
     * 4、if else while for等所有接数据块的表达式后面的内容必须用大括号扩
     *    扩起来,即使只有一条语句,不允许if (TRUE) return 0;
     * 5、起始大括号和结束大括号都独占一行
     * 6、不要在任何行尾留有空格或tab
     * 7、编辑器要设置成等宽字体,方便对齐和确定每行不超过80个字符
     */
    if (argc <= 1)
    {
        /*!
         * 1、任何时候不要直接在代码中使用printf或者printk等输出语句,
         *    要使用带输出级别控制的输出语句,可以是操作系统自带的,也可以
         *    是自己单独写的一个输出控制模块
         * 2、输出字符串末尾不要带句号,输出信息不要有中文
         * 3、语句中, 逗号后要有一个空格
         */
        pr_info("Error: Using %s -o option -f string\n", argv[0]);

        /*! return语句需要和上面的内容隔开一行 */
        return ERR_PARAM;
    }

    pr_info("%s %s %s: Hello world\n", argv[0], __DATE__, __TIME__);

    return 0;
}

采用2.2的自定义配置文件,执行doxygen Doxyfile

  • 未生成前目录
    在这里插入图片描述
  • 生成后目录
    在这里插入图片描述

执行firefox out/html/index.html,采用火狐浏览器打开说明文件的html格式
在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值