Linux下Doxgen的安装与使用
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:【Doxgen的注释】、【才鲸 / 嵌入式编程技巧】
- 开发环境:Linux 3.4.2内核、arm-linux-gcc 4.3.2工具链
一、安装
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、注释
- 头文件注释
/** @brief 摘要
* @file 文件名
* @author 作者
* @version 版本
* @date 日期
* @note 注解. 例如: 本文件有什么具体功能啊, 使用时要注意什么啊..
* @since 自从...
*/
- 函数注释
/** 函数的概述
* @param[in] 输入参数1
* @param[in] 输入参数2
* @param[out] 输出参数1
* @return 返回值解释一下
* @warning 警告: 例如: 参数不能为空之类的
* @note 注解
* @see 类似于请参考xxoo函数之类的
* @todo 可描述算法比较好
* @exception 函数抛出异常
*/
返回值也可以这样写:
@retval 1 成功
@retval 0 失败
- 块注释模板
/*---第一种(比较常用)---*/
/**
* ... text ...
*/
/*---第二种(比较常用)---*/
/*!
* ... text ...
*/
/*---第三种(比较显眼)---*/
/********************************************//**
* ... text
***********************************************/
/*---第四种(比较显眼)---*/
/************************************************
* ... text
***********************************************/
- 变量注释注释
/*---第一种(详细描述)---*/
int var; /**< Detailed description after the member */
/*---第二种(简要描述)---*/
int var; //!< Brief description after the member
/*---第三种(简要描述)---*/
int var; ///< Brief description after the member
- 常用关键字
@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
后,在需要生成说明文件的工程目录中
- 执行
doxgen -g
,此时会在该目录下生成Doxyfile
默认配置文件(具体代码如下所示); - 执行
doxgen
,此时会按照配置文件中的信息生成说明文件(html、latex格式); - 执行
firefox +所在目录/index.html
,此时就会打开说明文件的html版本。
2.2 自定义配置文件
根据官方的说明文档自己编写配置参数,下面的配置文件是比较通用的(出自:https://gitee.com/langcai1943/embedded_programming_skills/tree/develop/)
-
假设自定义配置文件名为
Doxyfile1
,则生成说明文件执行doxgen Doxyfile1
即doxgen + 自定义配置文件名
-
执行
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
格式