1、尽量使用枚举和宏来替代具体的数字量。一个极端的要求是:代码中除了0,1,-1外其他的变量都必须通过枚举或宏定义出现。这样做主要是为了易读和易维护。特别是一个常量在多个地方使用,修改时只需要修改宏定义,不要到处替换,不用担心漏掉。
2、对于反应外设或者多任务操作的变量,最好定义为volatile类型,避免编译器优化出错。
3、尽量做到一个函数只有一个出口(只有一条return语句)
4、对于宏拓展的特性,宏参数一定要加上括号。例:
#define SK_HDI_TASK_DELAY_MS(ms) task_delay(6250*ms)
SK_HDI-TASK_DELAY_MS(3 + 10);就会出现不是预期的效果。
正确的定义:
#define SK_HDI_TASK_DELAY_MS(ms) task_delay(6250*(ms))
5、没有参数列表的函数也要声明为void,因为不写c默认能传任何参数。
6、为了兼容不同的系统,文件名最好是小写字母加下划线组成。如:sk_hdi_i2c.c。
7、不要让浮点数和0比较,不要让BOOL类型和0、1比较。
一、 bool类型和零值的比较。
If(bTestFlag == TRUE),或者if(bTestFlag ==FALSE)
二、 浮点型和零值的比较
If((fTestFlag >=-EPSION)&&(fTestFlag <= EPSION))
8、为了提高效率,在几个条件为“&&”的关系的if语句中,尽量将容易FALSE的语句写在前面;在几个条件为“||”的if语句中,把容易为TRUE的条件写在前面。
9、在函数的入口处对参数的有效性进行检查。
10、 函数的参数不应该过多,最好把有关联的参数组成一个结构。由于结构参数是传值的,所以结构参数最好传指针。
11、 对动态申请的内存要进行检查申请是否成功;检查是否存在泄漏;严格遵守“谁申请,谁释放”原则。尽量避免一个动态申请的地址赋给多个变量。
12、 头文件头部应该包含注释,注释内容包含文件名、创始及修改者、版本信息、 创建日期、模块版本号、功能描述、修改记录等。
13、 为了防止重复包含,必须加上预编译开关,与编译开关由文件的名字的大写加下划线H组成。如:
Ifndef SK_HDI_I2C_H
#define SK_HDI_I2C_H
#endif
14、 程序中不要出现标志符完全相同的局部变量和全局变量,尽管作用域不同,但会使人误解。
15、 属于某一软件模块内部并能相对独立的完成某一功能或算法的较为重要的函数需在头部编写注释。注释内容包含函数名、类型、输入、输出、目的、算法或原理。
16、使用断言来预警程序没有往预期的方向运行。对于release版本断言没有作用。