1 文件头部规范
创建新文件时,复制到文件头部。
/**
******************************************************************************
* @file fytpi_dsp.c
* @author xxx
* @brief DSP
* @date 2021-8-9
******************************************************************************
* @attention 数字信号处理
* 文件头注释,宽度为80个字符,为后续代码行宽提供参照。
* 参考doxygen注释规范
*
* Copyright (c) CSU_RM_FYT.
* All rights reserved.
*
* This software component is licensed by xxx under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
******************************************************************************
*修改记录:
*<时间> |<版本> |<作者> |<描述>
*2021-08-21 |v1.0 |xxx |首次发布
******************************************************************************
**/
/* includes ------------------------------------------------------------------*/
/* typedef -------------------------------------------------------------------*/
/* define --------------------------------------------------------------------*/
/* variables -----------------------------------------------------------------*/
/* function ------------------------------------------------------------------*/
防止头文件被重复引用
/* 文件名前名加两个下划线“__”,后面加 “_H” */
#ifndef __DISP_H
#define __DISP_H
#endif
2 命名规范
-
文件名
能体现文件的核心功能,全部小写,以"_"分隔不同单词
例如关于控制的pid.c,关于云台的gimbal.c,关于姿态解算的imu_packet.c
-
函数名
能体现函数的核心功能,全部小写,以"_"分隔不同单词
例如关于底盘速度控制的chassis_speed_control()
-
变量名
帕斯卡(Pascal)命名法
首字母大写,不要下划线"_"
例如变量Chassis、HolderPitchAngle
*对于需要显示类型的变量,允许添加前缀
例如全局变量g_GimbalPid
常用前缀表示,推荐使用如下类型,用int32_t代替int、uint8_t代替unsigned char
使用部分类型之前,需要包含C/C++标准库**<stdint.h>**
类型 前缀 例 int、 int8_t、 int16_t、 int32_t s、 s8、 s16、 s32 s16_Speed unsigned char、uint8_t、uint16_t、uint32_t u8、u8、u16、u32 u8_Data double、float d、f f_PitchAngle bool b b_State extern、global g g_Holder 指针 p p_Msg 复合类型用“_”隔开,例如int32_t类型的全局变量s32_g_Chassis
结构体变量后缀Struct,如ChassisStruct
较短的单词可通过去掉“元音”形成缩写
常见缩写参考https://blog.csdn.net/qq_37851620/article/details/94731227
全名 缩写 temp tmp flag flg statistic stat increment inc message msg calculate calc number num maximum max … … -
结构体或联合体
需要用typedef重定义
原结构体前加下划线"_",避免与其他变量发生冲突
typedef struct _Chassis { M3508_t M3508[4]; /*< 每个成员都要有注释 */ uint8_t CanData[8]; /*< CAN数据缓冲区 */ SuperCap_t SuperCap; /*< 超级电容 */ MoveData_t MoveData; /*< 移动数据 */ }CHASSIS_T; /*< 全大写,后缀T */
-
宏定义
全大写,用"_"分隔不同单词,用括号包围定义的参数
例如
#define CHASSIS_FOLLOW (0) #define INFO_START (“Hello”)
3 注释规范
-
文件头部注释如“1 文件头部规范”
-
函数头注释
/** * @brief 简介,float数字取绝对值 * @param 参数,InNum输入数字 * @retval 返回值,输入数字的绝对值 * @attention 备注 */ float f_math_abs(float InNum) { float RetNum; /*< 返回值 */ /* 计算绝对值 */ if (InNum>=0) { RetNum = InNum; } else { RetNum = -InNum; } return RetNum; }
-
语句注释
不能使用“//”进行注释
语句和注释之间至少空一格
/* */ 中注释与两边星号空一格
float f_math_abs(float InNum) { float RetNum; /*< 返回值 */ /* 第一种,写在语句上面 */ if (in_num>=0) { RetNum = InNum; /*< 第二种,写在语句后面,用"/*< */"表示注释左边的语句 */ } else { RetNum = -InNum; } return RetNum; }
第一种针对一整块代码进行注释,第二种针对某条单独语句进行注释
4 排版规范
-
程序块采用统一缩进风格,缩进空格为4个
尽量使用空格键进行缩进,或设置编辑器将tab键转换为空格,避免不同编辑器tab键长度不同
-
不同代码块或不同函数之间只空一行
-
较长语句(>80字)要分成多行书写,例如
uart2_send_wave(5, 4, &Holder.Pitch.TarAngle, &Holder.Pitch.Angle, &Holder.Pitch.TarSpeed, &Holder.Pitch.Speed, &Holder.Pitch.Output);
-
switch必须要有default
-
if、while、for等无论语句长短,不能省略"{}",例如
/* 不符合规范 */ if (Num == 8) return; if (Num == 8) { return; } /* 符合规范 */ /* if 后空格 */ /* {}需换行 */ if (Num == 8) { return; } for (i=1; i<n; i++) { Num = i; }
-
空格
/* 逗号、分号后面加空格 */ /* =、<、+、-等双目操作符两边加空格 */ /* ++、--等单目操作符不加空格 */ for (i = 1; i < n; i++)