目录
前言
为了能够养成良好的代码注释风格,我对常用的注释进行了总结。以Doxygen的注释风格为主。
一、头文件内注释
1、头文件整体注释
在头文件的开始部分,通常会有一个整体的注释块,描述该头文件的用途和包含的内容。
/**
* @file example.h
* @brief 头文件的简短描述。
*
* 这里是头文件的详细描述,可以包含头文件的用途、功能等信息。
* @author 作者名
* @date 时间
* @version 版本号
*/
#ifndef EXAMPLE_H
#define EXAMPLE_H
// ... 头文件内容 ...
#endif /* EXAMPLE_H */
2、宏定义注释
对于头文件中的宏定义,可以使用以下注释风格:
/**
* @brief 定义一个宏,用于检查整数是否为偶数。
*/
#define IS_EVEN(n) (((n) % 2) == 0)
3、类型定义注释
对于自定义的类型定义,可以使用以下注释风格:
/**
* @brief 定义一个颜色类型。
*/
typedef enum
{
RED, /**< 红色 */
GREEN, /**< 绿色 */
BLUE /**< 蓝色 */
} Color;
4、变量声明注释
对于全局变量的声明,可以使用以下注释风格:
/**
* @brief 全局配置参数。
*
* 这个变量用于存储全局配置参数。
*/
extern int global_config;
5、函数声明注释
对于头文件中的函数声明,可以使用以下注释风格:
/**
* @brief 计算两个整数的和。
*
* 这个函数接收两个整数参数,并返回它们的和。
* @param a 第一个整数。
* @param b 第二个整数。
* @return 两个整数的和。
*/
int add(int a, int b);
/**
* @brief 初始化模块。
*
* 这个函数用于初始化模块,设置必要的变量和资源。
* @return 0表示成功,非0表示失败。
*/
int init_module();
二、源文件(.c文件)内注释
1、文件整体注释
在源文件的开始部分,通常会有一个整体的注释块,描述该文件的用途和包含的内容。
/**
* @file example.c
* @brief 这是example模块的源文件。
*
* 这里是文件的详细描述,可以包含文件的用途、功能等信息。
* @author 作者名
* @date 2024-10-31
* @version 1.0
*/
2、全局变量注释
对于源文件中的全局变量,可以使用以下注释风格:
/**
* @brief 全局配置参数。
*
* 这个变量用于存储全局配置参数。
*/
int global_config = 10;
3、静态变量注释
3.1静态变量的基本注释
对于静态变量,可以使用Doxygen注释来描述变量的用途、初始值以及任何相关的细节:
/**
* @brief 模块内使用的配置参数。
*
* 这个静态变量用于存储模块的配置参数,例如阈值或最大值。
*/
static int moduleConfig = 100;
3.2描述变量的生命周期和作用域
在注释中提及变量的作用域和生命周期可以帮助其他开发者理解变量的用途。
/**
* @brief 模块内使用的缓存数据。
*
* 这个静态变量用于缓存模块处理的数据,以提高性能。
* 由于它是静态的,数据在模块的整个生命周期内持续存在。
*/
static CacheData cacheData;
3.3描述变量的访问和修改
如果静态变量在模块内有特定的访问或修改规则,可以在注释中进行说明。
/**
* @brief 模块的初始化状态。
*
* 这个静态变量用于跟踪模块是否已经初始化。
* 只能在module_init()和module_shutdown()函数中修改此变量。
*/
static int initialized = 0;
void module_init()
{
initialized = 1; // 标记模块为已初始化
}
void module_shutdown()
{
initialized = 0; // 标记模块为未初始化
}
3.4使用@note和@warning
如果静态变量有特定的使用条件或限制,可以使用@note
或@warning
来提醒开发者。
/**
* @brief 模块的访问计数器。
*
* 这个静态变量用于计数模块被访问的次数。
* @note 这个变量应该只在线程安全的环境中修改。
*/
static int accessCounter = 0;
3.5示例
包含详细描述的静态变量注释
/**
* @brief 模块的全局错误代码。
*
* 这个静态变量用于存储模块遇到的最新错误代码。
* 它可以被模块内的任何函数读取,但只能被error_handling函数修改。
* @see error_handling()
*/
static int lastErrorCode = 0;
/**
* @brief 更新模块的最后错误代码。
*
* @param code 要设置的错误代码。
* @note 只有这个函数可以修改lastErrorCode。
*/
void error_handling(int code) {
lastErrorCode = code;
}
4、静态函数注释
对于源文件中的静态函数(仅在本文件中可见),可以使用以下注释风格:
/**
* @brief 计算两个整数的乘积。
*
* 这个函数接收两个整数参数,并返回它们的乘积。
* 这个函数是静态的,只能在本文件中使用。
*
* @param a 第一个整数。
* @param b 第二个整数。
* @return 两个整数的乘积。
*/
static int multiply(int a, int b)
{
return a * b;
}
5、函数定义注释
对于源文件中的函数定义,可以使用以下注释风格:
/**
* @brief 计算两个整数的和。
*
* 这个函数接收两个整数参数,并返回它们的和。
*
* @param a 第一个整数。
* @param b 第二个整数。
* @return 两个整数的和。
*/
int add(int a, int b)
{
return a + b;
}
使用@note和@warning
对于需要特别注意的地方,可以使用@note
和@warning
来标记。
/**
* @brief 执行某些操作。
*
* @note 这个函数假设输入值非空。
* @warning 如果输入值为空,函数将崩溃。
*/
void doSomething(char* input)
{
// 函数实现
}
6、函数内部注释
对于函数内部的复杂逻辑或重要的代码段,可以使用以下注释风格:
int add(int a, int b)
{
// 计算两个整数的和
int sum = a + b;
// 检查和是否超出整数范围
if (sum > INT_MAX) {
// 处理溢出情况
// ...
}
return sum;
}