嵌入式C语言编码规范
1、总体原则
1.1、代码以人为本
编写程序应该以人为本,计算机第二。代码首先是给人读的,好的代码应当可以像文章一样通顺易读。遵循以下原则:
- 不使用单词缩写、不使用汉语拼音
- 良好的命名规则
- 尽量不使用跨文件的全局变量
- 废弃的代码要及时清除
- 重复代码应该尽可能提炼成函数,避免出现过长的函数
- 文件职责单一化
- 一个函数仅完成一个功能
1、文件与目录
原则:嵌入式代码每个.c文件必须包含一个.h文件。函数的定义应在相应的.c文件中,声明在相应的.h文件中。
1.1、 对于源码文件中的段落安排
我们建议按如下的顺序排列:
- 文件头注释
- 防止重复引用头文件的设置
- #include 部分
- #define 部分
- enum 常量声明
- 类型声明和定义,包括 struct、union、typedef 等
- 全局变量声明
- 文件级变量声明
- 全局或文件级函数声明
- 函数实现。按函数声明的顺序排列
- 文件尾注释
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、总体注释要求
- 注释语言必须准确、易懂、简洁;
- 修改代码同时修改相应的注释, 以保证注释与代码的一致性,不再有用的注释要删除;
- 建议多使用中文,除非能用非常流利准确的英文表达。
- 采用中文注释时采用GB2312编码方式进行编码。
- 优秀的代码可以自我解释,不通过注释即可轻易读懂。
- 注释应与其描述的代码靠近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
- 注释与所描述内容进行同样的缩排。
2.2、源文件头部的注释
/*==========================================================================================================================
// Copyright @ 公司名称,2018-2020,项目
// @文件名称: (文件名)
// @文件说明: (用于详细说明此程序文件完成的主要功能,与其他模块或函数的接口,输出值、取值范围、含义及参数间的控制、顺序、独立或依赖等关系)
//--------------------------------------------------------------------------------------------------------------------------
// @硬件平台: 芯片型号
// @软件平台: 软件型号
//--------------------------------------------------------------------------------------------------------------------------
// 版本号 日期 作者 说明
============================================================================================================================*/
2.3、函数头部的注释
/*==========================================================================================================================
// @函数名称:
// @函数描述:
//--------------------------------------------------------------------------------------------------------------------------
// @参数值:
// 输入参数:
// 输出参数:
// @返回值:
============================================================================================================================*/
2.4、块注释
开头: /*
结尾: */
例:
/*
* ... This is a block comment ...
*/
2.5 行注释
开头: //
例:
// This is a line comment...
3、命名规则
3.1、总体命名要求
- 所有命名都应使用标准的英文单词或缩写,最好不使用拼音或拼音缩写,除非该名字描述的是中文特有的内容,如半角、全角, 声母、韵母等。
- 所有命名都应遵循达意原则,即名称应含义清晰、明确。
- 所有命名都应该完整的反应具体的功能。
- 所有命名都应尽量使用全称。
3.2、文件命名规则
- 用户编写的文件命名统一采用小写字符+下划线的方式。
实例:task_app_diagnostic.c task_app_diagnostic.h - 文件名要与模块名对应。
3.3、函数命名规则
3.3.1、普通函数
- 函数命名应以函数要执行的动作命名,一般采用动词或者动词+名词的结构
- 函数命名使用驼峰命名法,一个文件的内部使用static关键字限制函数作用域。
//文件内部函数
static int16_t Service0x10Process(uint8_t *udsData, uint16_t udsLen, uint8_t functionAddressFlag)
//文件外部函数
void TaskEcuDiagnostic(void *pvParameters)
- 函数参数尽量保持顺序从左到右为:输入、修改、输出。
3.3.2、指针函数
- 采用*p+驼峰命名法
typedef int16_t (*pServiceFunction)(uint8_t *udsData, uint16_t udsLen, uint8_t functionAddressFlag);
3.4、宏命名规则
- 宏定义全部使用大写,两个单词之间用下划线隔开。
- 除了头文件或编译开关等特殊标识定义,宏定义不能使用下划线“_”开头和结尾
- 用宏定义表达式时,要使用完备的括号
- 将宏定义的多条表达式放在大括号中,更好的方法是多条语句写成do while(0)的方式。
- 使用宏时,不允许参数发生变化
- 尽量使用函数代替宏表达式
- 常量建议使用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、变量命名
- 局部变量采用小驼峰命名法,即第一个单词小写,第二个单词首字母大写
uint8_t negativeNum = 0;
- 跨文件的全局变量在小驼峰命名法加前缀’g_’
uint8_t g_negativeNum = 0;
- 本文件的全局变量在小驼峰命名法加前缀’m_’
uint8_t m_negativeNum = 0;
- 静态变量在小驼峰命名法增加“s_”前缀。
static uint8_t sNegativeNum = 0;
- 指针变量加“p_”
- 除了通用的缩写以外,不得使用单词缩写,不得使用汉语拼音
3.7、类型命名
3.7.1、结构体类型
- 采用str_+大驼峰式命名法_TypeDef,成员变量采用小驼峰命名法
typedef struct
{unsigned char studentName;unsigned char studentAge;......}str_StudentTypeDef,*str_pStudentTypeDef;str_StudentTypeDef str_Student;
3.7.2、枚举类型
- 采用enum_+大驼峰式命名法_TypeDef,成员变量采用小驼峰命名法
typedef enum
{securityTimerNone,securityTimerResetDelay,......}enum_SecurityTimerTypeDef;enum_SecurityTimerTypeDef m_securityTimer;
4、排版布局
4.1、头文件排版布局
头文件排版内容依次为包含的头文件、宏定义、类型定义、声明变量、声明函数。且各个种类的内容间空三行。
嵌入式C语言编码规范相关推荐
- 嵌入式C语言编码规范参考
1 总则 1.1 目的 本规范主要目的是定义基于嵌入式C 编码的总体规范,确保编码的规范性,提高程序的可维护性.通过遵循共同的编码规范,程序开发人员可以保持代码一贯的风格,提高代码编写的可读性和使用的 ...
- 【转】嵌入式软件:C语言编码规范
引 言 嵌入式系统是指以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能.可靠性.成本.体积和功耗严格要求的专门计算机系统.嵌入式技术并不是一个独立的学科,它是伴随着微电子技术和计算 ...
- 【转载】Uber Go语言编码规范
文章目录 Uber Go语言编码规范 一. 介绍 二. 指导原则 指向interface的指针 接收器(receiver)与接口 零值Mutex是有效的 在边界处拷贝Slices和Maps 接收Sli ...
- Uber Go 语言编码规范
Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter.其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap.jaeger 等.2 ...
- Java语言编码规范(1)
Java语言编码规范 原文出处http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html 2 文件名(File Names) 这部分列出了常 ...
- 嵌入式C语言代码规范
C语言代码规范 参考安富莱C语言编码规范 1.文件与目录 1.文件及目录的命名规定可用的字符集是[A-Z:a-z:0-9:._-]. 2.源文件名后缀用小写字母 .c 和.h. 3.文件的命名要准确清 ...
- c语言编码风格,讲嵌入式C语言编码风格.ppt
讲嵌入式C语言编码风格 目 录 简介及说明 语言规则 1.基础 2.数据 3.说明与表达式 4.函数 5.内存及资源 6.源文件 风格指导 7.程序书写 8.命名 9.文档 简介及说明 正确性 易维护 ...
- c语言把一段编码注释,C语言编码规范——着重注意点整理
C语言编码规范--着重注意点整理 发布时间:2018-05-26 21:50, 浏览次数:260 C语言编码规范--着重注意点整理 编码规范的目的: 保证不同背景和经历的开发同学可以良好的协同开发 保 ...
- C语言编码规范——着重注意点整理
C语言编码规范--着重注意点整理 编码规范的目的: 保证不同背景和经历的开发同学可以良好的协同开发 保证组织级的开发技能和经验得以共享和传承 编程最难的是命名!因为其他的算法.数据结构都有据可循. 命 ...
- Google重磅发布Go语言编码规范
前言 Google官方在2022.11.23重磅发布了Go语言编码规范. 这个编码规范源自于Google内部的Go项目,是Google的开发人员要遵守的代码规范. 在Go语言诞生后,全世界的Go开发者 ...
最新文章
- 行人检测--What Can Help Pedestrian Detection?
- 云原生应用程序的架构应该怎么设计?
- “JavaScript patterns”中译本 - 《JavaScript 模式》第三章
- 简单纯文字浮动信息-Tooltip
- 世界科学技术通史_全球科技通史
- 详解 | 引起电源模块发热的4个主要原因
- ajax请求php省略后缀,如何在PHP中更安全地处理Ajax请求?
- spring总结(01)
- 添加公共引用目录_3分钟解决200页Word生成目录的问题,无需插件,领导看了直夸奖...
- “金嗓子”宣布退市!曾因罗纳尔多代言争议爆红,广告词家喻户晓…
- java和c语言的区别_C语言为何不会过时?你需要掌握多少种语言?
- 一些C#实用的方法汇总
- VMware View 要求操作句柄的状态错误
- 关于SDIO接口用作TF卡接口的接法以及电压的选择
- 高中英语老师教师资格证考试成功通过前辈备考经验谈
- Javascript中transducer的应用
- linux usb 全向麦克风,推崇金典款的适合80平方中小会议室使用的USB有线会议阵列麦克风...
- div+css静态网页设计——代码质量好-海贼王(6页) 学生漫画网页设计模板代码 漫画网页制作模板 学生简单动漫网站设计成品
- 五、空气质量分析与结果展示
- php邮箱必填,WordPress移除用户新注册时邮件必填选项(注册不填邮箱/邮箱非必填)...
热门文章
- beanshell断言_Jmeter之BeanShell断言使用(示例代码)
- 浙大中控T9100系统在压缩机上的应用
- 手工修复Win 7下彩影ARP防火墙驱动程序(适用于32/64位系统)
- 服务器突然c盘的temp文件夹,c盘里突然出了很多TEMP文件?
- Nginx爆出新漏洞,谨防“拖库”风险
- ResourceBundle使用详解
- 系统分析师 考试大纲
- Flash 3D之旋转文字
- linux在服务器上下载文件,上传下载文件到Linux服务器
- 有关linux表情图片,面向Ubuntu的LumaQQ个人修改版下载(支持新款表情)