说明:同一项目组最好采用相同的智能语言编辑器,如Muiti Editor,Visual Editor等,并设计、使用一套缩进宏及注释宏等,将缩进等问题交由编辑器处理。
?10-3 :要小心地使用编辑器提供的块拷贝功能编程
说明:当某段代码与另一段代码的处理功能相似时,许多开发人员都用编辑器提供的块拷贝功能来完成这段代码的编写。由于程序功能相近,故所使用的变量、采用的表达式等在功能及命名上可能都很相近,所以使用块拷贝时要注意,除了修改相应的程序外,一定要把使用的每个变量仔细查看一遍,以改成正确的。不应指望编译器能查出所有这种错误,比如当使用的是全局变量时,就有可能使某种错误隐藏下来。
?10-4 :合理地设计软件系统目录,方便开发人员使用
说明:方便、合理的软件系统目录,可提高工作效率。目录构造的原则是方便有关源程序的存储、查询、编译、链接等工作,同时目录中还应具有工作目录----所有的编译、链接等工作应在此目录中进行,工具目录----有关文件编辑器、文件查找等工具可存放在此目录中。
?10-5 :某些语句经编译后产生告警,但如果你认为它是正确的,那么应通过某种手段去掉告警信息
说明:在Borland C/C++中,可用“#pragma warn”来关掉或打开某些告警。 示例:
#pragma warn -rvl // 关闭告警 int examples_fun( void ) {
// 程序,但无return语句。 }
#pragma warn +rvl // 打开告警
编译函数examples_fun时本应产生“函数应有返回值”告警,但由于关掉了此告警信息显示,所以编译时将不会产生此告警提示。
?10-6 :使用代码检查工具(如C 语言用PC-Lint )对源程序检查
?10-7 :使用软件工具(如 LogiSCOPE )进行代码审查
〔十一〕 =====[ 代码测试、维护 ]=====
111-1 :单元测试要求至少达到语句覆盖
111-2 :单元测试开始要跟踪每一条语句,并观察数据流及变量的变化 111-3 :清理、整理或优化后的代码要经过审查及测试 111-4 :代码版本升级要经过严格测试 111-5 :使用工具软件对代码版本进行维护
111-6 :正式版本上软件的任何修改都应有详细的文档记录 ?11-1 :发现错误立即修改,并且要记录下来 ?11-2 :关键的代码在汇编级跟踪
?11-3 :仔细设计并分析测试用例,使测试用例覆盖尽可能多的情况,以提高测试用例的效率
?11-4 :尽可能模拟出程序的各种出错情况,对出错处理代码进行充分的测试 ?11-5 :仔细测试代码处理数据、变量的边界情况
?11-6 :保留测试信息,以便分析、总结经验及进行更充分的测试 ?11-7 :不应通过“ 试” 来解决问题,应寻找问题的根本原因 ?11-8 :对自动消失的错误进行分析,搞清楚错误是如何消失的 ?11-9 :修改错误不仅要治表,更要治本
?11-10 :测试时应设法使很少发生的事件经常发生
?11-11 :明确模块或函数处理哪些事件,并使它们经常发生
?11-12 : 坚持在编码阶段就对代码进行彻底的单元测试,不要等以后的测试工作来发现问题
?11-13:去除代码运行的随机性(如去掉无用的数据、代码及尽可能防止并注意函数中的“内部寄存器”等),让函数运行的结果可预测,并使出现的错误可再现
〔十二〕 =====[ 宏 ]=====
112-1 :用宏定义表达式时,要使用完备的括号 示例:如下定义的宏都存在一定的风险。 #define RECTANGLE_AREA( a, b ) a * b #define RECTANGLE_AREA( a, b ) (a * b) #define RECTANGLE_AREA( a, b ) (a) * (b)
正确的定义应为:
#define RECTANGLE_AREA( a, b ) ((a) * (b))
112-2: 将宏所定义的多条表达式放在大括号中
示例:下面的语句只有宏的第一条表达式被执行。为了说明问题,for语句的书写稍不符规范。
#define INTI_RECT_VALUE( a, b )\\ a = 0;\\ b = 0;
for (index = 0; index < RECT_TOTAL_NUM; index++) INTI_RECT_VALUE( rect.a, rect.b );
正确的用法应为:
#define INTI_RECT_VALUE( a, b )\\ {\\
a = 0;\\ b = 0;\\ }
for (index = 0; index < RECT_TOTAL_NUM; index++) {
INTI_RECT_VALUE( rect[index].a, rect[index].b ); }
112-3: 使用宏时,不允许参数发生变化 示例:如下用法可能导致错误。 #define SQUARE( a ) ((a) * (a))
int a = 5; int b;
b = SQUARE( a++ ); // 结果:a = 7,即执行了两次增1。
正确的用法是:
b = SQUARE( a );
a++; // 结果:a = 6,即只执行了一次增1。
=========================== End ==============================