C语言规范

本文详细介绍了C/C++编程中的文件头部、命名、注释和排版规范,包括文件头注释模板、函数和变量命名规则、代码注释格式以及代码排版的统一缩进和空格使用。此外,还强调了防止头文件重复引用的方法和宏定义的全大写规则。遵循这些规范可以提高代码可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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_ts、 s8、 s16、 s32s16_Speed
    unsigned char、uint8_t、uint16_t、uint32_tu8、u8、u16、u32u8_Data
    double、floatd、ff_PitchAngle
    boolbb_State
    extern、globalgg_Holder
    指针pp_Msg

    复合类型用“_”隔开,例如int32_t类型的全局变量s32_g_Chassis

    结构体变量后缀Struct,如ChassisStruct

    较短的单词可通过去掉“元音”形成缩写

    常见缩写参考https://blog.csdn.net/qq_37851620/article/details/94731227

    全名缩写
    temptmp
    flagflg
    statisticstat
    incrementinc
    messagemsg
    calculatecalc
    numbernum
    maximummax
  • 结构体或联合体

    需要用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++)
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值