之前总是对自己的变量、函数等名称定义没有一个具体清晰的命名规范,现在具体整理一下,记录以及方便后续参考。
一、核心原则
- 可读性优先:名称需清晰表达用途,避免缩写(如 cnt → count)。
- 作用域标识:通过前缀/后缀区分全局变量、静态变量等。
- 模块化分层:使用前缀标识模块/组件(如 Timer_、Sensor_)。
- 风格一致性:同一项目中保持命名规则统一。
二、具体规则
1. 变量命名
类型 | 规则 | 示例 |
---|
局部变量 | 类型前缀 + 小驼峰 | u8_currentCount, u8_sensorData | 全局变量 | g_ + 类型前缀 + 小驼峰 | g_u8_tickCount | 静态变量 | s_ + 小驼峰 | s_buffer | 指针变量 | p + 大驼峰(或明确类型描述) | g_p_nextNode, p_uartHandle | 常量 | 全大写 + _ 分隔 | MAX_BUFFER_SIZE |
2. 函数命名
类型 | 规则 | 示例 | 关键说明 |
---|
公有函数 | 模块前缀 + 返回值前缀 + 大驼峰 + 动作描述 | Timer_xStart(), Sensor_uxGetCount() | 前缀顺序:返回值类型 → 模块 → 动作 | 静态/私有函数 | 模块前缀 + prv + 大驼峰 | Timer_prvInternalInit() | 私有函数无需返回值前缀 | 返回值前缀规则 | 根据返回值类型选择前缀: - x: 返回 BaseType_t(FreeRTOS标准) - ux: 返回 UBaseType_t - v: 无返回值(void) - pv: 返回指针(如 void*) - e: 返回枚举类型 | Queue_xSend(), Timer_eGetMode() | 强制要求:模块前缀必须存在,避免全局命名冲突 |
3. 类型与结构体
类型 | 规则 | 示例 |
---|
结构体类型 | 模块前缀 + _t 后缀 | Timer_Config_t, Sensor_Data_t | 枚举类型 | 模块前缀 + _e 后缀 | Timer_Mode_e, Sensor_Status_e | 枚举值 | 全大写 + 模块前缀 + _ 分隔 | TIMER_MODE_PERIODIC, SENSOR_STATUS_READY |
4. 宏定义
类型 | 规则 | 示例 |
---|
功能宏 | 全大写 + 模块前缀 + _ 分隔 | TIMER_ENABLE(), SENSOR_DEBUG_ENABLED | 配置宏 | 模块前缀 + _CFG_ + 全大写 | TIMER_CFG_MAX_COUNT, SENSOR_CFG_SAMPLE_RATE |
5. 文件与模块
类型 | 规则 | 示例 |
---|
源文件 | 模块名 + .c | timer.c, sensor_driver.c | 头文件 | 模块名 + .h | timer.h, sensor_driver.h | 模块内部函数 | 头文件中用 static 限制作用域 | static void prvTimer_InternalDelay() |
|