单片机全局有必要封装_MCU-C程序基本编程规范(转)

为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范。本标准规定了程序设计人员进行程序设计时必须遵循的规范。本规范主要针对单片机编程语言和08编译器而言,包括排版、注释、命名、变量使用、代码可测性、程序效率、质量保证等内容。

1.基本规则格式清晰、注释简明扼要、命名规范易懂、函数模块化、程序易读易维护、功能准确实现、代码空间效率和时间效率高、适度的可扩展性、单片机编程规范-标识符命名

2.标识符命名

2.1命名基本原则(1)命名清晰明了,有明确含义,使用完整单词或约定俗成的缩写。通常,较短的单词可通过去掉元音字母形成缩写;较长的单词可取单词的头几个字母形成缩写。即"见名知意"。(2)命名风格要自始至终保持一致。

(3)命名中若使用特殊约定或缩写,要有注释说明。

(4)同一软件产品内模块之间接口部分的标识符名称之前加上模块标识。

2.2宏和常量命名

宏和常量用全部大写字母来命名,词与词之间用下划线分隔。对程序中用到的数字均应用有意义的枚举或宏来代替。

2.3变量命名

变量名用小写字母命名,每个词的第一个字母大写。类型前缀(u8\s8 etc.)全局变量另加前缀g_。

局部变量应简明扼要。局部循环体控制变量优先使用i、j、k等;局部长度变量优先使用len、num等;临时中间变量优先使用temp、tmp等。

2.4函数命名

函数名用小写字母命名,每个词的第一个字母大写,并将模块标识加在最前面。

2.5文件命名

一个文件包含一类功能或一个模块的所有函数,文件名称应清楚表明其功能或性质。每个.c文件应该有一个同名的.h文件作为头文件。

3.注释

3.1注释基本原则

有助于对程序的阅读理解,说明程序在"做什么",解释代码的目的、功能和采用的方法。

一般情况源程序有效注释量在30%左右。

注释语言必须准确、易懂、简洁。

边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。汇编和C中都用"//",取消";"不使用段注释" /**/ "(调试时可用)

3.2文件注释

文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。

修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。所有修改记录必须保持完整。

文件注释放在文件顶端,用"/*……*/"格式包含。

注释文本每行缩进4个空格;每个注释文本分项名称应对齐。

/***********************************************************

文件名称:

作者:

版本:

说明:

修改记录:

***********************************************************/

3.3函数注释

3.3.1函数头部注释

函数头部注释应包括函数名称、函数功能、入口参数、出口参数等内容。如有必要还可增加作者、创建日期、修改记录(备注)等相关项目。

函数头部注释放在每个函数的顶端,用"/*……*/"的格式包含。其中函数名称应简写为FunctionName(),不加入、出口参数等信息。

/***********************************************************

函数名称:

函数功能:

入口参数:

出口参数:

备注:

***********************************************************/

3.3.2代码注释

代码注释应与被注释的代码紧邻,放在其上方或右方,不可放在下面。如放于上方则需与其上面的代码用空行隔开。一般少量注释应该添加在被注释语句的行尾,一个函数内的多个注释左对齐;较多注释则应加在上方且注释行与被注释的语句左对齐。

函数代码注释用"//…//"的格式。

通常,分支语句(条件分支、循环语句等)必须编写注释。其程序块结束行"}"的右方应加表明该程序块结束的标记"end of……",尤其在多重嵌套时。

3.4变量、常量、宏的注释

同一类型的标识符应集中定义,并在定义之前一行对其共性加以统一注释。对单个标识符的注释加在定义语句的行尾。

全局变量一定要有详细的注释,包括其功能、取值范围、哪些函数或过程存取它以及存取时的注意事项等。注释用"//…//"的格式。

4.函数

4.1函数设计原则函数的基本要求:

1)封装性

1)正确性:程序要实现设计要求的功能。

2)稳定性和安全性:程序运行稳定、可靠、安全。

3)可测试性:程序便于测试和评价。

4)规范/可读性:程序书写风格、命名规则等符合规范。

5)扩展性:代码为下一次升级扩展留有空间和接口。

6)全局效率:软件系统的整体效率高。

7)局部效率:某个模块/子模块/函数的本身效率高。

编制函数的基本原则:

1)单个函数的规模尽量限制在200行以内(不包括注释和空行)。一个函数只完成一个功能。

2)函数局部变量的数目一般不超过5~10个。

3)函数内部局部变量定义区和功能实现区(包含变量初始化)之间空一行。

4)函数名应准确描述函数的功能。通常使用动宾词组为执行某操作的函数命名。

5)函数的返回值要清楚明了,尤其是出错返回值的意义要准确无误。

6)不要把与函数返回值类型不同的变量,以编译系统默认的转换方式或强制的转换方式作为返回值返回。

7)减少函数本身或函数间的递归调用。

8)尽量不要将函数的参数作为工作变量。

4.2函数定义

1)函数若没有入口参数或者出口参数,应用void明确申明。

2)函数名称与出口参数类型定义间应该空一格且只空一格。

3)函数名称与括号()之间无空格。

4)函数形参必须给出明确的类型定义。

5)多个形参的函数,后一个形参与前一个形参的逗号分割符之间添加一个空格。

6)函数体的前后花括号"{}"各独占一行。

4.3局部变量定义

1)同一行内不要定义过多变量。

2)同一类的变量在同一行内定义,或者在相邻行定义。

3)先定义data型变量,再定义idtata型变量,再定义xdata型变量.(?)

4)数组、指针等复杂类型的定义放在定义区的最后。

5)变量定义区不做较复杂的变量赋值。

4.4功能实现区规范

1)一行只写一条语句。

2)注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。

3)各程序段之间使用一个空行分隔,加以必要的注释。程序段指能完一个较具体的功能的一行或多行代码。程序段内的各行代码之间相互依赖性较强。(1、2、3方式)

4)不要使用难懂的技巧性很高的语句。

5)源程序中关系较为紧密的代码应尽可能相邻。6)完成简单功能、关系非常密切的一条或几条语句可编写为函数或定义为宏。

5.单片机编程规范-排版

5.1缩进

代码的每一级均往右缩进4个空格的位置。不使用Tab键

5.2分行

每行语句(?????超过80个字符)要分成多行书写;长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进适当的缩进,使排版整齐,语句可读。避免把注释插入分行中。

5.3空行

1)文件注释区、头文件引用区、函数间应该有且只有一行空行。

2)相邻函数之间应该有且只有一行空行。

3)函数体内相对独立的程序块之间可以用一行空行或注释来分隔。

4)函数注释和对应的函数体之间不应该有空行。

5)文件末尾有且只有一行空行。

5.4空格

1)函数语句尾部或者注释之后不能有空格。

2)括号内侧(即左括号后面和右括号前面)不加空格,多重括号间不加空格。

3)函数形参之间应该有且只有一个空格(形参逗号后面加空格)。

4)同一行中定义的多个变量间应该有且只有一个空格(变量逗号后面加空格)。

5)表达式中,若有多个操作符连写的情况,应使用空格对它们分隔:

6)在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符前后均加一个空格;在两个以上的关键字、变量、常量进行非对等操作时,其前后均不应加空格;

7)逗号只在后面加空格;

8)双目操作符,如比较操作符,赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位操作符"<

9)单目操作符,如"!"、"~"、"++"、"-"、"&"(地址运算符)等,前后不加空格;

10) "->"、"."前后不加空格;

11) if、for、while、switch等关键字与后面的括号间加一个空格;

5.5花括号

1)if、else if、else、for、while语句无论其执行体是一条语句还是多条语句都必须加花括号,且左右花括号各独占一行。

2)do{}while()结构中,"do"和"{"均各占一行,"}"和"while();"共同占用一行。

if ( ) do

{ {

} }while( );

else

{

}嵌套越少越好,{}不准超过3层

5.6 switch语句

1)每个case和其判据条件独占一行。

2)每个case程序块需用break结束。特殊情况下需要从一个case块顺序执行到下一个case块的时候除外,但需要花括号在交界处明确注释如此操作的原因,以防止出错。

3) case程序块之间空一行,且只空一行。

4)每个case程序块的执行语句保持4个空格的缩进。

5)一般情况下都应该包含default分支。

Switch ( )

{

case x:

break;

case x:

break;

default:

break;

}

6.程序结构

6.1基本要求

1)有main()函数的.c文件应将main()放在最前面,并明确用void声明参数和返回值。

2)对由多个.c文件组成的模块程序或完整监控程序,建立公共引用头文件,将需要引用的库头文件、标准寄存器定义头文件、自定义的头文件、全局变量等均包含在内,供每个文件引用。通常,标准函数库头文件采用尖角号< >标志文件名,自定义头文件采用双撇号″″标志文件名。

3)每个.c文件有一个对应的.h文件,.c文件的注释之后首先定义一个唯一的文件标志宏,并在对应的.h文件中解析该标志。

在.c文件中:

#define FILE_FLAG

在.h文件中:&

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

The selected server is enabled,but is not configured pro

The selectedserver is enabled,but is not configured properly.Deployment to itwill not be permitted until the problem is corrected.Pleasenavigate to the server preference pages and verify the field withthe prompt:tomcat jdk name: 翻译&#xff1a;选定的服务器…

懒惰评估

最近&#xff0c;我正在编写log4j附加程序&#xff0c;并希望在自定义附加程序创建过程中使用logger记录一些诊断详细信息&#xff0c;但是log4j初始化仅在创建附加程序实例后才完成&#xff0c;因此该阶段记录的消息将被忽略。 我感到需要在自定义附加程序中进行延迟初始化&a…

python基础_格式化输出(%用法和format用法)

%用法 1、整数的输出 %o —— oct 八进制%d —— dec 十进制%x —— hex 十六进制 >>> print(%o % 20) 24 >>> print(%d % 20) 20 >>> print(%x % 20) 14 2、浮点数输出 2.1 格式化输出 %f ——保留小数点后面六位有效数字  %.3f&#xff0c;保留…

CSV大文件的处理(以ngsim数据为例):分割、导入与合并

逗号分隔值&#xff08;Comma-Separated Values&#xff0c;CSV&#xff0c;有时也称为字符分隔值&#xff0c;因为分隔字符也可以不是逗号&#xff09;&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;。纯文本意味着该文件是一个字符序列&…

python用scrapy爬虫豆瓣_爬虫教程——用Scrapy爬取豆瓣TOP250

最好的学习方式就是输入之后再输出&#xff0c;分享一个自己学习scrapy框架的小案例&#xff0c;方便快速的掌握使用scrapy的基本方法。本想从零开始写一个用Scrapy爬取教程&#xff0c;但是官方已经有了样例&#xff0c;所以还是不写了&#xff0c;尽量分享在网上不太容易找到…

context-param与init-param的区别与作用

<context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>2.紧接着,容器创建一个Servl…

如何快速批量修改文件名

文件太多&#xff0c;文件名太乱&#xff0c;希望快速批量修改文件名&#xff0c;以下的两种方法可以帮到你&#xff0c;亲测好用。 方法一 1.选中需要批量修改的文件&#xff0c;如图1 图12.按F2键&#xff0c;输入文件名。如图2. 图23.Enter&#xff0c;效果如图3. 图3方法…

【LUOGU???】WD与积木 NTT

题目大意 把 \(n\) 个有标号物品分到一些有标号的箱子中且不允许为空&#xff0c;问期望箱子的数量。 多组询问。 \(n\leq 100000\) 题解 记 \(f_i\) 为 \(i\) 个有标号物品分到一些有标号的箱子中且不允许为空的箱子的数量之和。 记 \(g_i\) 为 \(i\) 个有标号物品分到一些有标…

7对讲机调频软件_对讲机怎么配对?

有好多朋友买到了新对讲机和老对讲机的频率不一样&#xff0c;从而导致了新旧对讲机无法通联。买到了新对讲机&#xff0c;我们要先知道旧对讲机的频率是多少。要想知道旧对讲机的频率是多少&#xff0c;我们就要需要一定的工具&#xff0c;首先我们要有一台XP系统的电脑&#…

RTK、IMU、RT3000

GPS/RTK 全球卫星定位系统(GPS)的全面建成和发展&#xff0c;导致了导航和测绘行业的一场重大深刻的技术革命。常规的静态GPS测量方法越来越多地应用于高精度控制网的建立&#xff0c;但利用该方法无法在野外对观测数据进行实时检核&#xff0c;从而造成观测结果不合格而需要返…

POJ--3974 Palindrome(回文串,hash)

链接&#xff1a;点击这里 #include<iostream> #include<algorithm> #include<stdio.h> #include<cstring> using namespace std; #define maxn 1000005 #define LL long long #define ull unsigned long long const LL P 131; ull p[maxn10],f[maxn]…

Springboot 两种方式配置启动热部署(图文界面)

目录 前言1. 类加载启动2. devtools前言 Java的热部署(Hot Deployment)是指在应用程序运行时更新或替换类文件,而无需重新启动整个应用程序。 代表不停止应用程序的情况下修改代码并立即看到变化,这对于开发和调试过程非常有用。 类加载器(Class Loader): Java应用程序…

Microsoft VBScript 编译器错误 错误原因 代码大全

Microsoft VBScript 编译器错误 错误 缺少语句ActiveServerPages,ASP0126(0x80004005)-->找不到包含文件 MicrosoftOLEDBProviderforODBCDrivers(0x80040E21)-->sql语句出错(数据类型不匹配或表名(字段名)错误或表处于编辑状态&#xff0c;或表不存在于conn打开的数据库…

hadoop3 禁用ec_Hadoop + Amazon EC2 –更新的教程

hadoop3 禁用ec在Hadoop的Wiki页面上放置了一个旧教程&#xff1a; http : //wiki.apache.org/hadoop/AmazonEC2 &#xff0c;但是最近我不得不遵循本教程&#xff0c;并且我注意到它没有涵盖某些Amazon新功能。 建议您已经熟悉Hadoop的基础来学习本教程&#xff0c;可以在Had…

libuv 原理_Libuv初理解

整体概念libuv是一个跨平台、专门写给nodejs的库&#xff0c;它的设计是围绕着事件驱动的异步I/O模型。在不同的I/O轮询机制上&#xff0c;libuv提供的不是简单抽象对象&#xff1a;handle和streams为sockets和其他实例提供了一个高级抽象。此外&#xff0c;libuv还提供了跨平台…

Matlab排序函数sort()和sortrows()

sort() 调用形式 1.Ysort(X) 对矩阵、向量或数组进行升序排列。 例1 >> amagic(4)a 16 2 3 135 11 10 89 7 6 124 14 15 1>> brand(1,4)b 0.8147 0.9058 0.1270 0.9134>> sort(a)ans 4 2 3…

[Swift]LeetCode968.监控二叉树 | Binary Tree Cameras

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…

Maven神秘化

由于我的Android开发的背景下&#xff0c;我比较习惯到摇篮 &#xff0c;而不是Maven的 。 尽管我知道Gradle基于Maven&#xff0c;但我从未调查过幕后发生的事情。 在过去的一周中&#xff0c;我一直在尝试了解细节并找出Maven的不同组成部分。 什么是Maven Maven是主要用于J…

走进JVM【二】理解JVM内存区域

引言 对于C程序员&#xff0c;内存分配与回收的处理一直是令人头疼的问题。Java由于自身的自动内存管理机制&#xff0c;使得管理内存变得非常轻松&#xff0c;不容易出现内存泄漏&#xff0c;溢出的问题。 不容易不代表不会出现问题&#xff0c;一旦内存泄漏或溢出的情况发生&…

mysql一对多_mysql一对多查询合并多的一方的数据。

有时候会有这样一个需求&#xff0c;查询的一条记录需要包含另一个表的多条记录&#xff0c;并且让多条记录成为一个字段组成最终的一条记录。比较难描述&#xff0c;看例子吧。创建一个产品表&#xff1a;create table product(proId int(10),proName varchar(50))创建一个成分…