1.排版
a.代码的缩进为4个空格。
b. 较长的代码分两行书写。
c.函数的参数过多,分行书写。
d.if,do,while,switch,for,case,default等关键字,必须加上大括号{}。
2.注释
a.边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删 除。
b.说明性文件必选在文件头着重说明,例如*.c,*.h文件
c.函数头应该进行注释,例如函数的名称,输入参数,返回值,功能说明。
d.全局变量要注释其功能,若为关键的局部变量同样需要注释其功能。
e.复杂的宏定义同样要加上注释。
f.复杂的结构体同样要加上注释。
g.相对独立的语句组注释。对这一组语句做特别的说明,写在语句组的上侧,和此语句组之间不留空格,与当前语句组的缩进一致。注意说明语句组的注释一定要写在语句组上面,不能写在语句组下面。
3.标识符
a.变量的命名
1)局部变量以小写字母命名;
2)全局变量以首字母大写方式命名;
3)定义类型和宏定义常数以大写字母命名;
4)变量的作用域越大,它的名字所带有的信息就应该越多。
5)局部变量:intstudent_age;
6)全局变量:intStudentAge;
7)宏定义常数:#define STUDENT_NUM 10
8)类型定义:typedefINT16S int
b.变量命名要注意缩写而且让人简单易懂,若是特别缩写要详细说明。
c.全局变量和全局函数的命名一定要详细,不惜多用几个单词。
d.用于编译开关的文件头,必须加上当前文件名称,防止编译时冲突。
例如在lcd.h头文件中,必须加上以下内容
#ifndef __LCD_H__
#define __LCD_H__
…...............
#endif
e.禁止用汉语拼音作为标识符名称,可读性很差。
f.名称间的区别显而易见。使用标识符名称要注意的一个问题是发生在名称之间只有一个字符或少数字符不同的情况,特别是名称比较长时,当名称间的区别很容易被误读时问题就比较显著,比如1(数字1)和l(L的小写),0(数字0)和O(字母O),2和z,5和S,n和h;
4.表达式和基本语句
a.不要编写太复杂表达式
b.不要有多用途的复合表达式
c.如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
d.if语句
d.a 布尔变量与零值比较
不可将布尔变量直接与TRUE,FALSE,0,1进行比较(根据布尔类型的定义,零值为“假”(记FALSE),任何非零值都是“真”(记TRUE)).TRUE的值究竟是什么没有统一的标准。
例如:假设布尔变量名称为a,它与零值比较的标准if语句如下:
if(a) //表示a为真时满足条件
if(!a) //表示a为假时满足条件
d.b 整型变量与零值比较
应当将整型变量用“==”或“!=”直接与0比较。
例如:假设整型变量为b,它与零值比较的标准if语句如下:
if (0 == b)
if (0 != b)
d.c浮点变量与零值比较
不可将浮点变量用“==”或“!=”与任何数字比较。
5.杂项
a. 一些常量(如圆周率PI)或者常需要在调试时修改的参数最好用#define定义,但要注意宏定义只是简单的替换,因此有些括号不可少。
b. 不要轻易调用某些库函数,因为有些库函数代码很长
c. 对各运算符的优先级有所了解,记不得没关系,加括号就是(记住加减乘除就OK)
d. 不管有没有无效分支,switch函数一定要defaut这个分支。一来让阅读者知道程序员并没有遗忘default,并且防止程序运行过程中出现的意外(健壮性)。
e. 函数的参数和返回值没有的话最好使用void。
f. 一些常数和表格之类的应该放到code中去以节省RAM。
g. 程序编完编译看有多少code多少data,注意不要使堆栈为难。
h. 减少函数本身或函数间的递归调用
i. 编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。
j. 在多重循环中,应将最忙的循环放在最内层
k. 避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。
l. 系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
m. 编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。