前言
准备入行嵌入式,为了养成良好的编程习惯,提高代码的可读性与易维护性,定义一个个人使用的编程规范,希望自己以后使用该规范进行编程,同时也应尊重他人代码规范。
结构、使用规范
- 使用空格代替制表符,四字节空格为一个缩进;
- 尾行注释时使用12个缩进,语句过长超过12个缩进就在末尾加一个缩进即可;
- 函数与函数之间、代码块与代码块之间、不同含义语句上下文之间要留有空行;
- 使用5个缩进作为文本行开始的偏移量;
- if、for、while、switch与左括号之间空一格括号里不需要;
- 自加、自减等单目运算符与变量之间不应加空格;
- 无特殊情况使用--i或者++i,尽量不使用i++与i--;
- 使用 . 与 -> 时不应有空格;
- 比较操作符,赋值操作符等双目运算符与变量之间要留有空格;
- 语句中,与;号后面要加空格;
- 按顺序声明局部变量(结构体、枚举、整数、浮点数,无符号优先);
- 在同一行中声明所有相同类型的局部变量;
- 程序块的分界符(如大括号‘{’和‘}’ )应各独占一行并且位于同一列;
- 对变量的定义、分支语句(条件分支、循环语句等)、功能代码块必须编写注释;
- 不要使用stdbool.h库。分别使用1或0表示真或假;
- 统一使用 stdint.h 库中数据类型定义变量;
- 当函数可以接受任何类型的指针时,总是使用void *,不要使用uint8_t *。函数在实现时必须注意正确的类型转换;
- 永远不要将布尔处理的变量与0或1进行比较。用NOT(!)代替;
- 文件底部要留有空行;
uint8_t bFlag /*!< 标志位 */
void vShiLiOne(void)
{
for (uint8_t i = 0; i < 8; ++i)
{
if (i >= 5)
{
bFlag = 0x01;
}
}
}
uint16_t usShiLiTwo(uint32_t ulData, float *pfBuff)
{
if (!bFlag)
{
return 0;
}
return 1;
}
命名规范
变量命名以及函数命名使用前缀加帕斯卡命名(单词首字母大写),前缀见下表:
变量类型 | 前缀 | 举例 | 变量类型 | 前缀 | 举例 |
uint8_t | uc | ucData | int8_t | c | cData |
uint16_t | us | usData | int16_t | s | sData |
uint32_t | ul | ulData | int32_t | l | lData |
uint8_t * | ucp | ucpData | int8_t * | cp | cpData |
uint16_t * | usp | uspData | int16_t * | sp | spData |
uint32_t * | ulp | ulpData | int32_t * | lp | lpData |
uint8_t 数组 | uca | ucaData | int8_t 数组 | ca | caData |
uint16_t 数组 | usa | usaData | int16_t 数组 | sa | saData |
uint32_t 数组 | ula | ulaData | int32_t 数组 | la | laData |
float | f | fData | double | d | dData |
bool(uint8_t) | b(尽量不用) | bData | void * | px | pxData |
static | s_命名 | s_Data | const | c_命名 | c_Data |
全局 | g_命名 | g_Data | 静态定义函数 | prv | prvData() |
有返回函数 | 返回值类型 | ucData | 无返回函数 | v | cData() |
结构体 | t | tLed | 枚举 | e | eLed |
宏定义、结构体、枚举使用单独规范
宏定义:全部大写、单词与单词之间有下划线分开,末尾以_MACRO结尾,带参宏定义使用_FUNC(也可以不加后缀);
结构体:全部大写、单词与单词之间有下划线分开,末尾以_STRUCT结尾;
枚举:全部大写、单词与单词之间有下划线分开,末尾以_ENUM结尾;
文件规范
文件(.c与.h)说明
/**
* @file xxx.h或xxx.c
* @brief 文件说明
* @author 作者
* @date 时间
* @copyright (C) Copyright 2024,XXX,All Rights Reserved.
*
* # update (更新日志)
*
* Date Author Notes
* 时间 作者 版本
*
*/
头文件格式
#ifndef __BSP_ADC_H__
#define __BSP_ADC_H__
#include "main.h"
//--------------------------------------------[Config]----------------------------------------------------
//--------------------------------------------[Statement]-------------------------------------------------
//--------------------------------------------[Function]--------------------------------------------------
#endif /*__BSP_ADC_H__*/
//=========================================== End Of File ===========================================//
文本结束
//=========================================== End Of File ===========================================//
注释规范
简单说明 --- 块注释
/**
*
*/
函数注释 --- 可做删减,有则加无则删
/**
* @brief 系统时钟初始化
* @param[in] 无
@arg 无
* @param[out] 无
* @retval 无
@brf 无
* @author FQY
* @data 2022-06-01
*/
结构体枚举注释
/**
* @brief 详细描述
*/
注释 --- 函数外部注释、尾行注释
/*!< 定义一个整型变量a */
注释 --- 函数内部注释
/* 定义一个整型变量a */
尾行注释依然使用
/*!< 定义一个整型变量a */
注意事项
- 不要初始化静态和全局变量为0(或NULL),编译器会处理;
- 指针与空值进行比较,指针与指针不进行比较;
- 函数不修改指针所指向的内存,则使用const作为指针;
- 不修改函数的形参或变量时,则使用const修饰;
- 宏定义时用圆括号保护输入参数,用括号保护最终的宏计算;