原创 程序代码写作规范

2013-8-16 14:58 1781 19 20 分类: 工程师职场

基本要求

程序结构清析,简单易懂,单个函数的程序行数不得超过100行。

< >打算干什么,要简单,直接了当,代码精简,避免垃圾程序。>尽量使用公共函数,c51的标准库函数谨慎使用。>不要随意定义全局变量,尽量使用局部变量。>使用括号以避免二义性。>非万不得已不要使用浮点运算。一般的小数运算可以使用定点数实现。/>/>/>/>

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

>>>>

可读性要求

>可读性第一,效率第二。>保持注释与代码完全一致。>每个源程序文件,都有文件头说明,说明规格见规范。>每个函数,都有函数头说明,说明规格见规范。>主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。>常量定义(define)有相应说明。>处理过程的每个阶段都有相关注释说明。>在典型算法前都有注释。>利用缩进来显示程序的逻辑结构,缩进量一致并以4个空格为单位。>循环、分支层次不要超过五层。>注释可以与语句在同一行,也可以在上行。>空行和空白字符也是一种特殊注释。>一目了然的语句不加注释。>注释的作用范围可以为:定义、引用、条件分支以及一段代码。/>/>/>/>/>/>/>/>/>/>/>/>/>/>

>>>>>>>>>>>>>>

结构化要求

>禁止出现两条等价的支路。>非必要不要使用goto语句。goto一般用于从内循环直接跳到循环外部、检测到错误直接跳到错误处理程序。影响可读性时禁止使用goto语句。>用 if 语句来强调只执行两组语句中的一组。>用 case 实现多路分支。>避免从循环引出多个出口。>尽量减少函数的出口。>避免不必要的分支。>不要轻易用条件分支去替换逻辑表达式。/>/>/>/>/>/>/>/>

>>>>>>>>

正确性与容错性要求

>程序首先是正确,其次是优美。>无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。>改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。>所有变量在调用前必须被初始化。>对所有的用户输入,必须进行合法性检查。>不要比较浮点数的相等,如: 10.0 * 0.1 == 1.0 , 不可靠。>函数对接受的参数应该进行合法性检查。>单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。>尽量不要使用==作为判断条件,应该用>=,<=替代。/>/>/>/>/>/>/>/>/>

>>>>>>>>>

可重用性要求

>所有c语言程序文件只包含一个头文件config.h,在config.h中包含其它头文件。>重复使用的完成相对独立功能的算法或代码应编入一个文件,并且使用头文件>设定一些与硬件相关的参数,这些参数在config.h中定义,模块自己的头文件仅说明如何设定这些参数。>公共代码应考虑OO思想,减少外界联系,考虑独立性或封装性。>尽量少使用与编译器相关的特性。>取变量占用内存长度用"sizeof(变量类型)"而不用常量。/>/>/>/>/>/>

>>>>>>

命名规则

>变量命名>命名必须具有一定的实际意义,要“望文知义”。>根据变量的作用域决定名字的长短。作用域越大,名字越长。在整个程序中都要使用的变量就要长一些;而局部变量就可以短一些。>变量名中每一个单词首字母大以分隔单词。一些习惯单词如OK可以全部大写。>局部变量中可采用如下几个通用变量:TempNij(一般用于循环变量)。>常量命名和宏定义>常量和宏定义必须具有一定的实际意义。>局部使用的常量和宏定义在#include和函数定义之间。>常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一条定义的右侧必须有一简单的注释,说明其作用。>函数命名>结构体命名>,原则上前面以下划线开始;结构体变量命名必须用大小写字母组合,必要时可用下划线间隔。数据定义需注明其用途。/>/>/>/>/>/>/>/>/>/>/>/>

>>>>>>>>>>>>

注释

>原则上注释要求使用中文。>文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复杂的算法需要加上流程说明。>函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明。>程序中注释包括:修改时间和作者、方便理解的注释等。/>/>/>/>

>>>>

程序

>程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,尽量不采用递归模式。>编写程序时,亦必须想好测试的方法,换句话说,”单元测试” 的测试方案应在程序编写时一并拟好。>注释一定要与程序一致。>版本封存以后的修改一定要将老语句用 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。在注释中注明封闭代码的修改时间和原因。>程序中每个block 的开头 ”{""}” 必须对齐,嵌套的block 每进一套,缩进4个空格。block类型包括ifforwhiledo等关键字引出的。>对于比较大的函数,每个block 和特殊的函数调用,都必须注明其功能>循环、分支代码,判断条件与执行代码不得在同一行上。>指针的定义,* 号紧接变量名之前。例:int *pnsize;>else if 必须写在一行。/>/>/>/>/>/>/>/>/>

>>>>>>>>>

与‘{’、‘}’有关的各项规定

>‘{’、‘}’应独占一行。在该行内可有注释。>‘{’必须另起一行,‘{’ 之后的代码必须缩进4个空格。‘{’与‘}’必须在同一列上。>在循环、分支之后若只有一行代码,虽然可省略‘{’、‘}’,但不推荐这么做。若省略后可能引起歧义,则必须加上‘{’、‘}’。/>/>/>

>>>

与空格有关的各项规定

>在所有两目、三目运算符的两边都必须有空格。在单目运算符两端不必空格。但在‘—>’、‘::’、‘.’、‘[’、‘]’等运算符前后,及‘&’(取地址)、‘*’(取值)等运算符之后不得有空格。>forwhileif 等关键词之后应有1个空格,再接‘(’,之后无空格;在结尾的‘)’前不得有空格。>调用函数、宏时,‘(’、‘)’前后不得有空格。>类型强制转换时,‘(’‘)’前后不得有空格。/>/>/>/>

>>>>

与缩进有关的各项规定

>缩进以4个空格为单位。>下列情况,代码缩进一个单位:> />/>/>

>>>

  (i) if、elseforwhiledo 等之后的代码。

   (ii) 一行之内写不下,折行之后的代码,应在合理的位置进行折行。若有+ - * / 等运算符,则运算符应在上一行末尾,而不应在下一行的行首。

针对51系列补充

>推荐使用编程模式:ram小模式,rom:小模式。>尽量使用无符号数,尽量使用 unsigned char 数。>尽量不使用基本输入输出库函数。>尽量不要使用一般指针。>判断尽量使用>=<。>尽量避免使用程序延时。>所有循环避免可能出现的死讯循环,例:while(TI==0) TR1=1;(假定串行口使用定时器1)。>中断服务程序尽可能短。>禁止使用递归模式.>一般应用禁止使用浮点运算。>函数参数一般应该少于3个。/>/>/>/>/>/>/>/>/>/>/>

>>>>>>>>>>>

针对汇编的补充

>尽量使用宏汇编,不要使用小汇编。>使用小汇编时不要使用equ分配变量,要使用dataidataxdatabit等分配变量。>混合编程时,尽量先使用c写一个同名函数,然后再生成汇编文件,在这个汇编文件的基础上编写以避免错误。/>/>/>

/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/> />/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>

文章评论1条评论)

登录后参与讨论

DiracFatCat 2013-12-18 19:21

我的代码风格应该基本符合上述规范吧~除了注释和goto。除了文件头部表明的版本信息,其他地方我基本上不放注释,如果我的代码本身不能让阅读的人很清晰直观的明白它要干什么,就认为代码有问题;有段时间,我也是禁止了所有的goto语句,后来发现它确实在“检测到错误直接跳到错误处理程序”上非常方便,所以还是用的挺多。最近倾向linux内核源代码风格~

345002072_353389109 2013-2-23 15:29

过奖了,一起学习

用户429634 2013-2-21 10:28

不错,道出了地平面的真谛。

用户1629625 2013-1-23 12:34

不错
相关推荐阅读
用户424652 2014-09-27 13:09
3D打印前奏GCode代码(1)基本指令
GCode代码指令头: Gnnn:标准GCode命令,例如移动到一个坐标点。 Mnnn:RepRap定义的命令,例如打开一个冷却风扇。 Tnnn:选择工具代码nnn,在RepRap中,...
用户424652 2014-07-09 11:15
无线通信比较(1)
之前一直在研究ZigBee通信,眼下正要开发新的产品,顺势研究一下市面上的无线通信的方式。433MHz是一个开放的载波频段,比ZigBee通信有着更好的穿透性,很多工业场合使用该载波频段为载体进行...
用户424652 2014-06-30 09:08
时间常数(2)
对于电路时间常数RC的计算,归纳如下: 1、如果RC电路中的电源是电压源形式,先把电源“短路”而保留其串联内阻; 2、把去掉电源后的电路简化成一个等效电阻R和等效电容C串联的RC放电回路,...
用户424652 2014-06-28 16:24
OpenCV(2)
       新版本的OpenCV加入FaceRecognizer类,用于进行人脸识别,支持Eigenfaces、Fisherface、Local Binary Patterns Hisogram...
用户424652 2014-06-28 16:23
时间常数(1)
        时间常数:表示过度反应的时间过程的常数。指该物理量达到最大值的1/e所需要的时间。          电路中的时间常数:表示过度反应的时间过程常数。在电阻、电容的电路中,它是电...
用户424652 2014-06-27 16:27
STM32系列命名
STM32系列命名规则 STM32 F 103 C 6 T 7 xxx       1 2 3 4 5 6 7 8   第1部分:产品系列名,固定为STM32   第2部分:产品类型;F...
我要评论
1
19
关闭 站长推荐上一条 /2 下一条