1
www.cnasic.com
www.cnasic.com
第
第
七
七
讲
讲
编码风格(
编码风格(
Coding Style
Coding Style
)
)
凌明
trio@seu.edu.cn
东南大学国家专用集成电路系统工程技术研究中心
www.cnasic.com
www.cnasic.com
目录
简介及说明
语言规则
1.基础
2.数据
3.说明与表达式
4.函数
5.内存及资源
6.源文件
风格指导
7.程序书写
8.命名
9.文档
2
www.cnasic.com
www.cnasic.com
简介及说明
正确性
易维护性
易移植性
代码的高效性
www.cnasic.com
www.cnasic.com
float b, c[10];
float b, c[10];
void
void
abc(void
abc(void
)
)
{float
{float
zongfen
zongfen
= 0;
= 0;
int
int
d;
d;
for( d = 0; d < 10; d ++){
for( d = 0; d < 10; d ++){
if(c[d] > 0)
if(c[d] > 0)
zongfen
zongfen
+= c[b];
+= c[b];
b =
b =
zongfen
zongfen
/10;
/10;
}
}
这段程序在做什么?
这段程序是否有错误?
这程序中存在哪些不良的书写风格?它们可能会引起什么后果?
程序实例
3
www.cnasic.com
www.cnasic.com
float b, c[10];
void abc(void)
{float zongfen = 0; int d;
for( d = 0; d < 10; d ++){
if(c[d] > 0)
zongfen += c[b];
b = zongfen /10;}
#define STUDENT_NUM 10 //学生总数
float fAvgScore; //平均分
float fScore[STUDENT_NUM ]; //分数
/*平均分计算函数*/
void AvgScore(void)
{
int i;
float total_score = 0; //总分
for(i = 0; i < STUDENT_NUM; i++ )
{ //累加计算总分
if(fScore[i] > 0) //遇到负分,记为0分
total_score += fScore[i];
} //计算平均分
if(STUDENT_NUM >0)
fAvgScore = total_score / STUDENT_NUM;
}
有了哪些改进?
你认为还有什么地方需要改
进?
www.cnasic.com
www.cnasic.com
语言规则-基础
编写清晰表达设计思路和意图的代码
针对易读来优化代码, 效率的优化留给编译器去做.
编写可大声朗读的代码.
利用注释阐述和解释代码,并进行总结.
使用有意义且无歧义的命名方法.(推荐使用全英文的命
名)
尽可能使用标准C 函数.
不要将同样的代码使用三次以上, 编写相应的函数.
让程序自己检查运行中的错误-编写调试代码
4
www.cnasic.com
www.cnasic.com
语言规则-基础
谨慎使用GOTO语句.
不要修补那些风格差的代码,重写他们.
不要比较两个浮点数是否相等.
优化代码或调试一旧版本前,备份并记录所做的修改.
避免机器及编译器相关的代码,如必需,隔离相关代码.
将编译器设为最高警告水平,把每一个警告视为错误来
处理.
不要直接在程序中直接书写常量,应该使用常量的宏
定义
www.cnasic.com
www.cnasic.com
语言规则-避免使用
#include 的头文件没有被引用.
在同一个编译单元内(一般是一C文件)重复引用同一头文
件.
在头文件内说明却仅仅在一个C文件中引用.
全局量仅仅在一个C文件中引用. (应该使用static 量).
在付值中,左右两边的数据类型不一样. (如确实必须,应该
显式地进行类型转换)
函数返回指向函数内说明的自动变量的指针. (应该使用指
向static 变量的指针).
删除switch case 语句中的break语句(除非两个或多个
case的处理代码是完全一致的, 这时应该加以注释。)
5
www.cnasic.com
www.cnasic.com
语言规则-避免使用
两个不同类型指针间的运算.
隐含的数据类型转换.
隐含的对于变量是否为0的测试. (比如: “if (a =
b)” ; 正确的写法是 “if ( (a = b ) != 0)”)
缺少default 的switch 语句.
表达式中假设了运算顺序. (不要怕写括号)
忽略函数的返回值, 如果函数不需要返回值可使用
(void) f(); 但如果程序中无 返回值函数的数量太多,
则系统的设计可能有问题.
www.cnasic.com
www.cnasic.com
语言规则-依赖关系
模块间的依赖关系对于开发效率,可测性,可维护性都有
很大的影响. 良好的依赖关系应该是简单的,层次化的,
和非循环的.
函数间传递的参数越少越好,减少模块件的依赖关系和
耦合程度,最大程度上实现对模块的封装,将模块内的复
杂性屏蔽,而对外提供简洁的数据接口。
尽量减少全局量的使用,局限在一个c文件中的全局量
应该说明为 static。
对于一组在逻辑上相关的变量,应该尽量将他们封装在
结构中。