1、总体原则

1.1、代码以人为本

编写程序应该以人为本,计算机第二。代码首先是给人读的,好的代码应当可以像文章一样通顺易读。遵循以下原则:

  1. 不使用单词缩写、不使用汉语拼音
  2. 良好的命名规则
  3. 尽量不使用跨文件的全局变量
  4. 废弃的代码要及时清除
  5. 重复代码应该尽可能提炼成函数,避免出现过长的函数
  6. 文件职责单一化
  7. 一个函数仅完成一个功能

1、文件与目录

原则:嵌入式代码每个.c文件必须包含一个.h文件。函数的定义应在相应的.c文件中,声明在相应的.h文件中。

1.1、 对于源码文件中的段落安排

我们建议按如下的顺序排列:

  1. 文件头注释
  2. 防止重复引用头文件的设置
  3. #include 部分
  4. #define 部分
  5. enum 常量声明
  6. 类型声明和定义,包括 struct、union、typedef 等
  7. 全局变量声明
  8. 文件级变量声明
  9. 全局或文件级函数声明
  10. 函数实现。按函数声明的顺序排列
  11. 文件尾注释

1.2、在引用头文件时,使用 <> 来引用预定义或者特定目录的头文件,使用 “” 来引用当前目录或者路径相对于当前目录的头文件。

#include <stdio.h> /* 标准头文件 */
#include <projdefs.h> /* 工程指定目录头文件 */
#include “global.h” /* 当前目录头文件 */
#include “inc/config.h” /* 路径相对于当前目录的头文件 */

1.3、 为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。

#ifndef __DISP_H /* 文件名前名加两个下划线“__”,后面加 “_H”*/
#define __DISP_H//用户代码#endif

1.4、头文件中只存放“声明”而不存放“定义”,通过这种方式可以避免重复定义。

/* 模块 1 头文件: module1.h */
extern uint8_t g_ucPara; /* 在模块 1 的 .h 文件中声明变量 */
/* 模块 1 实现文件:module1.c */
uint8_t g_ucPara = 5; /* 在模块 1 的 .c 文件中定义全局变量 g_ucPara */

2、代码注释

2.1、总体注释要求

  1. 注释语言必须准确、易懂、简洁;
  2. 修改代码同时修改相应的注释, 以保证注释与代码的一致性,不再有用的注释要删除;
  3. 建议多使用中文,除非能用非常流利准确的英文表达。
  4. 采用中文注释时采用GB2312编码方式进行编码。
  5. 优秀的代码可以自我解释,不通过注释即可轻易读懂。
  6. 注释应与其描述的代码靠近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
  7. 注释与所描述内容进行同样的缩排。

2.2、源文件头部的注释


/*==========================================================================================================================
//  Copyright @ 公司名称,2018-2020,项目
//  @文件名称: (文件名)
//  @文件说明: (用于详细说明此程序文件完成的主要功能,与其他模块或函数的接口,输出值、取值范围、含义及参数间的控制、顺序、独立或依赖等关系)
//--------------------------------------------------------------------------------------------------------------------------
//  @硬件平台: 芯片型号
//  @软件平台: 软件型号
//--------------------------------------------------------------------------------------------------------------------------
//  版本号     日期          作者          说明
============================================================================================================================*/

2.3、函数头部的注释


/*==========================================================================================================================
//  @函数名称:
//  @函数描述:
//--------------------------------------------------------------------------------------------------------------------------
//  @参数值:
//      输入参数:
//      输出参数:
//  @返回值:
============================================================================================================================*/

2.4、块注释

开头: /*
结尾: */
例:

/*
* ... This is a block comment ...
*/

2.5 行注释
开头: //
例:

// This is a line comment...

3、命名规则

3.1、总体命名要求

  1. 所有命名都应使用标准的英文单词或缩写,最好不使用拼音或拼音缩写,除非该名字描述的是中文特有的内容,如半角、全角, 声母、韵母等。
  2. 所有命名都应遵循达意原则,即名称应含义清晰、明确。
  3. 所有命名都应该完整的反应具体的功能。
  4. 所有命名都应尽量使用全称。

3.2、文件命名规则

  1. 用户编写的文件命名统一采用小写字符+下划线的方式。
    实例:task_app_diagnostic.c task_app_diagnostic.h
  2. 文件名要与模块名对应。

3.3、函数命名规则

3.3.1、普通函数

  1. 函数命名应以函数要执行的动作命名,一般采用动词或者动词+名词的结构
  2. 函数命名使用驼峰命名法,一个文件的内部使用static关键字限制函数作用域。
//文件内部函数
static int16_t Service0x10Process(uint8_t *udsData, uint16_t udsLen, uint8_t functionAddressFlag)
//文件外部函数
void TaskEcuDiagnostic(void *pvParameters)
  1. 函数参数尽量保持顺序从左到右为:输入、修改、输出。

3.3.2、指针函数

  1. 采用*p+驼峰命名法
typedef int16_t (*pServiceFunction)(uint8_t *udsData, uint16_t udsLen, uint8_t functionAddressFlag);

3.4、宏命名规则

  1. 宏定义全部使用大写,两个单词之间用下划线隔开。
  2. 除了头文件或编译开关等特殊标识定义,宏定义不能使用下划线“_”开头和结尾
  3. 用宏定义表达式时,要使用完备的括号
  4. 将宏定义的多条表达式放在大括号中,更好的方法是多条语句写成do while(0)的方式。
  5. 使用宏时,不允许参数发生变化
  6. 尽量使用函数代替宏表达式
  7. 常量建议使用const定义代替宏

3.5、变量类型

尽量使用全称等

typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
#define __IO volatile

3.6、变量命名

  1. 局部变量采用小驼峰命名法,即第一个单词小写,第二个单词首字母大写
uint8_t negativeNum = 0;
  1. 跨文件的全局变量在小驼峰命名法加前缀’g_’
uint8_t g_negativeNum = 0;
  1. 本文件的全局变量在小驼峰命名法加前缀’m_’
uint8_t m_negativeNum = 0;
  1. 静态变量在小驼峰命名法增加“s_”前缀。
static uint8_t sNegativeNum = 0;
  1. 指针变量加“p_”
  2. 除了通用的缩写以外,不得使用单词缩写,不得使用汉语拼音

3.7、类型命名

3.7.1、结构体类型

  1. 采用str_+大驼峰式命名法_TypeDef,成员变量采用小驼峰命名法
typedef struct
{unsigned char studentName;unsigned char  studentAge;......}str_StudentTypeDef,*str_pStudentTypeDef;str_StudentTypeDef str_Student;

3.7.2、枚举类型

  1. 采用enum_+大驼峰式命名法_TypeDef,成员变量采用小驼峰命名法
typedef enum
{securityTimerNone,securityTimerResetDelay,......}enum_SecurityTimerTypeDef;enum_SecurityTimerTypeDef m_securityTimer;

4、排版布局

4.1、头文件排版布局

头文件排版内容依次为包含的头文件、宏定义、类型定义、声明变量、声明函数。且各个种类的内容间空三行。

嵌入式C语言编码规范相关推荐

  1. 嵌入式C语言编码规范参考

    1 总则 1.1 目的 本规范主要目的是定义基于嵌入式C 编码的总体规范,确保编码的规范性,提高程序的可维护性.通过遵循共同的编码规范,程序开发人员可以保持代码一贯的风格,提高代码编写的可读性和使用的 ...

  2. 【转】嵌入式软件:C语言编码规范

    引  言 嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能.可靠性.成本.体积和功耗严格要求的专门计算机系统.嵌入式技术并不是一个独立的学科,它是伴随着微电子技术和计算 ...

  3. 【转载】Uber Go语言编码规范

    文章目录 Uber Go语言编码规范 一. 介绍 二. 指导原则 指向interface的指针 接收器(receiver)与接口 零值Mutex是有效的 在边界处拷贝Slices和Maps 接收Sli ...

  4. Uber Go 语言编码规范

    Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter.其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap.jaeger 等.2 ...

  5. Java语言编码规范(1)

    Java语言编码规范 原文出处http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html 2 文件名(File Names) 这部分列出了常 ...

  6. 嵌入式C语言代码规范

    C语言代码规范 参考安富莱C语言编码规范 1.文件与目录 1.文件及目录的命名规定可用的字符集是[A-Z:a-z:0-9:._-]. 2.源文件名后缀用小写字母 .c 和.h. 3.文件的命名要准确清 ...

  7. c语言编码风格,讲嵌入式C语言编码风格.ppt

    讲嵌入式C语言编码风格 目 录 简介及说明 语言规则 1.基础 2.数据 3.说明与表达式 4.函数 5.内存及资源 6.源文件 风格指导 7.程序书写 8.命名 9.文档 简介及说明 正确性 易维护 ...

  8. c语言把一段编码注释,C语言编码规范——着重注意点整理

    C语言编码规范--着重注意点整理 发布时间:2018-05-26 21:50, 浏览次数:260 C语言编码规范--着重注意点整理 编码规范的目的: 保证不同背景和经历的开发同学可以良好的协同开发 保 ...

  9. C语言编码规范——着重注意点整理

    C语言编码规范--着重注意点整理 编码规范的目的: 保证不同背景和经历的开发同学可以良好的协同开发 保证组织级的开发技能和经验得以共享和传承 编程最难的是命名!因为其他的算法.数据结构都有据可循. 命 ...

  10. Google重磅发布Go语言编码规范

    前言 Google官方在2022.11.23重磅发布了Go语言编码规范. 这个编码规范源自于Google内部的Go项目,是Google的开发人员要遵守的代码规范. 在Go语言诞生后,全世界的Go开发者 ...

最新文章

  1. 行人检测--What Can Help Pedestrian Detection?
  2. 云原生应用程序的架构应该怎么设计?
  3. “JavaScript patterns”中译本 - 《JavaScript 模式》第三章
  4. 简单纯文字浮动信息-Tooltip
  5. 世界科学技术通史_全球科技通史
  6. 详解 | 引起电源模块发热的4个主要原因
  7. ajax请求php省略后缀,如何在PHP中更安全地处理Ajax请求?
  8. spring总结(01)
  9. 添加公共引用目录_3分钟解决200页Word生成目录的问题,无需插件,领导看了直夸奖...
  10. “金嗓子”宣布退市!曾因罗纳尔多代言争议爆红,广告词家喻户晓…
  11. java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?
  12. 一些C#实用的方法汇总
  13. VMware View 要求操作句柄的状态错误
  14. 关于SDIO接口用作TF卡接口的接法以及电压的选择
  15. 高中英语老师教师资格证考试成功通过前辈备考经验谈
  16. Javascript中transducer的应用
  17. linux usb 全向麦克风,推崇金典款的适合80平方中小会议室使用的USB有线会议阵列麦克风...
  18. div+css静态网页设计——代码质量好-海贼王(6页) 学生漫画网页设计模板代码 漫画网页制作模板 学生简单动漫网站设计成品
  19. 五、空气质量分析与结果展示
  20. php邮箱必填,WordPress移除用户新注册时邮件必填选项(注册不填邮箱/邮箱非必填)...

热门文章

  1. beanshell断言_Jmeter之BeanShell断言使用(示例代码)
  2. 浙大中控T9100系统在压缩机上的应用
  3. 手工修复Win 7下彩影ARP防火墙驱动程序(适用于32/64位系统)
  4. 服务器突然c盘的temp文件夹,c盘里突然出了很多TEMP文件?
  5. Nginx爆出新漏洞,谨防“拖库”风险
  6. ResourceBundle使用详解
  7. 系统分析师 考试大纲
  8. Flash 3D之旋转文字
  9. linux在服务器上下载文件,上传下载文件到Linux服务器
  10. 有关linux表情图片,面向Ubuntu的LumaQQ个人修改版下载(支持新款表情)