1. 前言
在嵌入式 C 语言开发中,标识符命名是代码可读性与可维护性的基石。由于嵌入式系统资源受限,开发者常倾向于使用缩写来缩短变量名和函数名,但过度或随意的缩写反而会降低代码的可读性,增加团队协作的沟通成本。本文整理了一份嵌入式开发中常用的标识符缩写对照表,并给出命名规范建议,帮助你在简洁与清晰之间找到平衡。
2. 常用缩写对照表
2.1 数据类型与基础操作
argument可缩写为argbuffer可缩写为buffclock可缩写为clkcommand可缩写为cmdcompare可缩写为cmpconfiguration可缩写为cfgdevice可缩写为deverror可缩写为err
2.2 数值与流程控制
hexadecimal可缩写为hexincrement可缩写为incinitialize可缩写为initmaximum可缩写为maxmessage可缩写为msgminimum可缩写为minparameter可缩写为paraprevious可缩写为prev
2.3 系统资源与状态
register可缩写为regsemaphore可缩写为semstatistic可缩写为statsynchronize可缩写为synctemp可缩写为tmp
2.4 缩写 vs 完整单词对比
下表汇总了本章节列出的全部缩写,并额外补充了 5 个嵌入式开发中常见但未列出的缩写,方便你在实际项目中快速查阅:
| 完整单词 | 推荐缩写 | 使用场景说明 |
|---|---|---|
argument | arg | 函数参数、命令行参数 |
buffer | buff | 数据缓冲区、环形队列 |
clock | clk | 时钟源、时钟分频配置 |
command | cmd | 命令解析、指令处理 |
compare | cmp | 数值比较、校验逻辑 |
configuration | cfg | 配置结构体、配置寄存器 |
device | dev | 外设设备、设备驱动句柄 |
error | err | 错误码、错误状态标志 |
hexadecimal | hex | 十六进制数值、进制转换 |
increment | inc | 计数器自增、索引递增 |
initialize | init | 初始化函数、初始化流程 |
maximum | max | 最大值、上限阈值 |
message | msg | 消息队列、通信报文 |
minimum | min | 最小值、下限阈值 |
parameter | para | 函数入参、配置参数 |
previous | prev | 上一状态、历史值保存 |
register | reg | 硬件寄存器、寄存器映射 |
semaphore | sem | 信号量、任务同步 |
statistic | stat | 统计信息、运行计数 |
synchronize | sync | 同步机制、数据同步 |
temp | tmp | 临时变量、暂存数据 |
interrupt | int | 中断服务函数、中断标志(补充) |
length | len | 数组长度、数据包长度(补充) |
pointer | ptr | 指针变量、指针参数(补充) |
status | sta | 状态寄存器、运行状态(补充) |
value | val | 通用数值、返回值(补充) |
3. 命名规范建议
3.1 缩写使用原则
- 优先使用业界通用缩写,避免自创缩写。
- 缩写应保持全项目统一,并在代码规范文档中登记。
- 对于生命周期长、作用域广的全局变量,建议使用完整单词。
3.2 命名风格示例
3.3 实战代码示例
下面以一段 UART 驱动初始化代码为例,展示上述缩写规范在实际项目中的应用:
#include<stdint.h>/* 宏定义:CFG 表示 configuration,MAX 表示 maximum */#defineCFG_MAX_BUF_SIZE256/* 函数名:uart 表示 UART 外设,init 表示 initialize */voiduart_init(uint32_tbaud_rate){/* 局部变量:tmp 表示 temp,buf 表示 buffer */uint8_ttmp_buf[CFG_MAX_BUF_SIZE];uint32_terr_code=0;/* 局部变量:cfg 表示 configuration,reg 表示 register */uint32_tcfg_reg=0;/* 局部变量:msg 表示 message */constchar*msg="UART init done";/* 局部变量:cnt 表示 count,max 表示 maximum */uint32_tcnt=0;uint32_tmax_retry=3;/* 初始化寄存器并检查错误 */cfg_reg=0x01;if(cfg_reg!=0x01){err_code=1;}/* 使用 tmp 变量暂存数据 */tmp_buf[0]=(uint8_t)cfg_reg;cnt++;}代码中的命名遵循以下缩写规则:
tmp_buf:temp缩写为tmp,buffer缩写为buferr_code:error缩写为errcfg_reg:configuration缩写为cfg,register缩写为regmsg:message缩写为msgmax_retry:maximum缩写为maxCFG_MAX_BUF_SIZE:configuration缩写为CFG,maximum缩写为MAX局部变量:
tmp_val、err_code函数名:
uart_init()、adc_read()宏定义:
CFG_MAX_BUF_SIZE
3.4 错误处理与边界条件
在实际嵌入式开发中,仅完成初始化逻辑还不够,还需要对错误与边界条件做充分处理。下面结合上文 UART 初始化代码,补充错误判断、重试机制与参数校验的实现建议。
1. 错误判断与返回处理
原示例中err_code仅被赋值,未做后续判断。更稳妥的做法是让uart_init()返回错误码,由调用方根据返回值决定后续流程:
#include<stdint.h>/* 宏定义:CFG 表示 configuration,MAX 表示 maximum */#defineCFG_MAX_BUF_SIZE256/* 错误码定义:ERR 表示 error */#defineERR_NONE0#defineERR_INVALID_ARG1#defineERR_TIMEOUT2/* 函数名:uart 表示 UART 外设,init 表示 initialize */uint32_tuart_init(uint32_tbaud_rate){/* 局部变量:err 表示 error,cfg 表示 configuration,reg 表示 register */uint32_terr_code=ERR_NONE;uint32_tcfg_reg=0;/* 参数合法性校验:baud_rate 为 0 时直接返回错误 */if(baud_rate==0){returnERR_INVALID_ARG;}/* 初始化寄存器 */cfg_reg=0x01;/* 模拟寄存器写入失败场景 */if(cfg_reg!=0x01){err_code=ERR_TIMEOUT;returnerr_code;}returnERR_NONE;}调用方在使用时应对返回值做完整判断:
uint32_tret=uart_init(115200);if(ret!=ERR_NONE){/* 错误处理:记录日志或进入异常恢复流程 */handle_uart_error(ret);}2.max_retry重试机制
max_retry表示最大重试次数。当初始化或寄存器写入失败时,可在有限次数内重试,避免无限阻塞:
uint32_tuart_init_with_retry(uint32_tbaud_rate){/* 局部变量:retry 表示重试次数,max 表示 maximum */uint32_tretry=0;uint32_tmax_retry=3;uint32_terr_code=ERR_NONE;if(baud_rate==0){returnERR_INVALID_ARG;}do{err_code=uart_init(baud_rate);if(err_code==ERR_NONE){break;}retry++;}while(retry<max_retry);returnerr_code;}3. 缓冲区溢出防护与参数校验
- 缓冲区溢出防护:写入
tmp_buf前必须检查索引是否越界,避免破坏栈或堆内存。 - 参数合法性校验:对
baud_rate等入参做范围检查,非法值(如 0)应提前返回错误。
/* 局部变量:idx 表示 index,buf 表示 buffer */uint32_tidx=0;uint8_ttmp_buf[CFG_MAX_BUF_SIZE];/* 写入前检查边界,防止缓冲区溢出 */if(idx<CFG_MAX_BUF_SIZE){tmp_buf[idx]=(uint8_t)cfg_reg;idx++;}else{/* 缓冲区已满,返回错误 */returnERR_INVALID_ARG;}通过以上错误处理与边界条件设计,可以让 UART 初始化代码在异常场景下依然保持健壮,同时继续遵循前文介绍的缩写命名规范。
4. 总结
合理的缩写能显著提升嵌入式代码的书写效率,但必须以可读性为前提。建议团队在项目启动时制定统一的缩写规范表,并在代码评审中严格执行,从而在代码简洁与可维护性之间取得最佳平衡。
5. 参考资料
- MISRA C:2012 编码规范
- 《嵌入式 C 语言编程规范》
- 各芯片厂商提供的固件库命名规范