目 录
1 排版
6
2 注释
11
3 标识符命名
18
4 读性
20
5 变量结构
22
6 函数程
28
7 测性
36
8 程序效率
40
9 质量保证
44
10 代码编辑编译审查
50
11 代码测试维护
52
12 宏
53
1 排版
¹ 11:程序块采缩进风格编写缩进空格数4
说明:开发工具动生成代码致
¹ 12:相独立程序块间变量说明必须加空行
示例:例子符合规范
if (valid_ni(ni))
{
program code
}
repssn_ind ssn_data[index]repssn_index
repssn_ni ssn_data[index]ni
应书写
if (valid_ni(ni))
{
program code
}
repssn_ind ssn_data[index]repssn_index
repssn_ni ssn_data[index]ni
¹ 13:较长语句(>80字符)分成行书写长表达式低优先级操作符处划分新行操作符放新行首划分出新行进行适缩进排版整齐语句读
示例:
perm_count_msgheadlen NO7_TO_STAT_PERM_COUNT_LEN
+ STAT_SIZE_PER_FRAM * sizeof( _UL )
act_task_table[frame_id * STAT_TASK_CHECK_NUMBER + index]occupied
stat_poi[index]occupied
act_task_table[taskno]duration_true_or_false
SYS_get_sccp_statistic_state( stat_item )
report_or_not_flag ((taskno < MAX_ACT_TASK_NUMBER)
&& (n7stat_stat_item_valid (stat_item))
&& (act_task_table[taskno]result_data 0))
¹ 14:循环判断等语句中较长表达式语句进行适应划分长表达式低优先级操作符处划分新行操作符放新行首
示例:
if ((taskno < max_act_task_number)
&& (n7stat_stat_item_valid (stat_item)))
{
program code
}
for (i 0 j 0 (i < BufferKeyword[word_index]word_length)
&& (j < NewKeywordword_length) i++ j++)
{
program code
}
for (i 0 j 0
(i < first_word_length) && (j < second_word_length)
i++ j++)
{
program code
}
¹ 15:函数程中参数较长进行适划分
示例:
n7stat_str_compare((BYTE *) & stat_object
(BYTE *) & (act_task_table[taskno]stat_object)
sizeof (_STAT_OBJECT))
n7stat_flash_act_duration( stat_item frame_id *STAT_TASK_CHECK_NUMBER
+ index stat_object )
¹ 16:允许短语句写行中行写条语句
示例:例子符合规范
rectlength 0 rectwidth 0
应书写
rectlength 0
rectwidth 0
¹ 17:iffordowhilecaseswitchdefault等语句占行iffordowhile等语句执行语句部分少加括号{}
示例:例子符合规范
if (pUserCR NULL) return
应书写:
if (pUserCR NULL)
{
return
}
¹ 18:齐空格键TAB键
说明:免编辑器阅读程序时TAB键设置空格数目造成程序布局整齐BC作编辑器合版BC会动8空格变TAB键BC合入版会缩进变乱
¹ 19:函数程开始结构定义循环判断等语句中代码采缩进风格case语句情况处理语句遵语句缩进求
¹ 110:程序块分界符(CC++语言括号{’}’)应独占行位列时引语句左齐函数体开始类定义结构定义枚举定义iffordowhileswitchcase语句中程序采缩进方式
示例:例子符合规范
for () {
program code
}
if ()
{
program code
}
void example_fun( void )
{
program code
}
应书写
for ()
{
program code
}
if ()
{
program code
}
void example_fun( void )
{
program code
}
¹ 111:两关键字变量常量进行等操作时间操作符前者前加空格进行非等操作时果关系密切立操作符(->)应加空格
说明:采种松散方式编写代码目代码更加清晰
留空格产生清晰性相已非常清晰语句中没必留空格果语句已足够清晰括号侧(左括号面右括号前面)需加空格重括号间必加空格CC++语言中括号已清晰标志
长语句中果需加空格非常应该保持整体清晰局部加空格操作符留空格时连续留两空格
示例:
(1) 逗号分号面加空格
int a b c
(2)较操作符 赋值操作符 +算术操作符+逻辑操作符&&&位域操作符<<^等双目操作符前加空格
if (current_time > MAX_TIME_VALUE)
a b + c
a * 2
a b ^ 2
(3)~++&(址运算符)等单目操作符前加空格
*p 'a' 容操作*容间
flag isEmpty 非操作容间
p &mem 址操作& 容间
i++ ++容间
(4)>前加空格
p>id pid >指针前加空格
(5) ifforwhileswitch等面括号间应加空格if等关键字更突出明显
if (a > b && c > d)
½ 11:行程序80字符宜写长
2 注释
¹ 21:般情况源程序效注释量必须20%
说明:注释原助程序阅读理解该加方加注释宜太太少注释语言必须准确易懂简洁
¹ 22:说明性文件(头文件h文件inc文件def文件编译说明文件cfg等)头部应进行注释注释必须列出:版权说明版号生成日期作者容功文件关系修改日志等头文件注释中应函数功简说明
示例:面段头文件头注释较标准然局限格式述信息建议包含
*************************************************
Copyright (C) 19881999 Huawei Tech Co Ltd
File name 文件名
Author Version Date 作者版完成日期
Description 详细说明程序文件完成功模块
函数接口输出值取值范围含义参数间控
制序独立赖等关系
Others 容说明
Function List 函数列表条记录应包括函数名功简说明
1
History 修改历史记录列表条修改记录应包括修改日期修改
者修改容简述
1 Date
Author
Modification
2
*************************************************
¹ 23:源文件头部应进行注释列出:版权说明版号生成日期作者模块目功函数功修改日志等
示例:面段源文件头注释较标准然局限格式述信息建议包含
************************************************************
Copyright (C) 19881999 Huawei Tech Co Ltd
FileName testcpp
Author Version Date
Description 模块描述
Version 版信息
Function List 函数功
1
History 历史修改记录
David 961012 10 build this moudle
***********************************************************
说明:Description项描述文件容功部部分间关系文件文件关系等History修改历史记录列表条修改记录应包括修改日期修改者修改容简述
¹ 24:函数头部应进行注释列出:函数目功输入参数输出参数返回值调关系(函数表)等
示例:面段函数注释较标准然局限格式述信息建议包含
*************************************************
Function 函数名称
Description 函数功性等描述
Calls 函数调函数清单
Called By 调函数函数清单
Table Accessed 访问表(项仅牵扯数库操作程序)
Table Updated 修改表(项仅牵扯数库操作程序)
Input 输入参数说明包括参数作
取值说明参数间关系
Output 输出参数说明
Return 函数返回值说明
Others 说明
*************************************************
¹ 25:边写代码边注释修改代码时修改相应注释保证注释代码致性注释删
¹ 26:注释容清楚明含义准确防止注释二义性
说明:错误注释益反害
规27:避免注释中缩写特非常缩写
说明:缩写时前应缩写进行必说明
¹ 28:注释应描述代码相代码注释应放方右方(单条语句注释)相邻位置放面放方需面代码空行隔开
示例:例子符合规范
例1:
* get replicate sub system index and net indicator *
repssn_ind ssn_data[index]repssn_index
repssn_ni ssn_data[index]ni
例2:
repssn_ind ssn_data[index]repssn_index
repssn_ni ssn_data[index]ni
* get replicate sub system index and net indicator *
应书写
* get replicate sub system index and net indicator *
repssn_ind ssn_data[index]repssn_index
repssn_ni ssn_data[index]ni
¹ 29:物理含义变量常量果命名充分注释声明时必须加注释说明物理含义变量常量宏注释应放方相邻位置右方
示例:
* active statistic task number *
#define MAX_ACT_TASK_NUMBER 1000
#define MAX_ACT_TASK_NUMBER 1000 * active statistic task number *
¹ 210:数结构声明(包括数组结构类枚举等)果命名充分注释必须加注释数结构注释应放方相邻位置放面结构中域注释放域右方
示例:形式说明枚举数联合结构
* sccp interface with sccp user primitive message name *
enum SCCP_USER_PRIMITIVE
{
N_UNITDATA_IND * sccp notify sccp user unit data come *
N_NOTICE_IND * sccp notify user the No7 network can not *
* transmission this message *
N_UNITDATA_REQ * sccp user's unit data transmission request*
}
¹ 211:全局变量较详细注释包括功取值范围函数程存取存取时注意事项等说明
示例:
* The ErrorCode when SCCP translate *
* Global Title failure as follows * 变量作含义
* 0 - SUCCESS 1 - GT Table error *
* 2 - GT error Others - no use * 变量取值范围
* only function SCCPTranslate() in *
* this modual can modify it and other *
* module can visit it through call *
* the function GetGTTransErrorCode() * 方法
BYTE g_GTTranErrorCode
¹ 212:注释描述容进行样缩排
说明:程序排版整齐方便注释阅读理解
示例:例子排版整齐阅读稍感方便
void example_fun( void )
{
* code one comments *
CodeBlock One
* code two comments *
CodeBlock Two
}
应改布局
void example_fun( void )
{
* code one comments *
CodeBlock One
* code two comments *
CodeBlock Two
}
¹ 213:注释面代码空行隔开
示例:例子显代码紧凑
* code one comments *
program code one
* code two comments *
program code two
应书写
* code one comments *
program code one
* code two comments *
program code two
¹ 214:变量定义分支语句(条件分支循环语句等)必须编写注释
说明:语句程序实现某特定功关键维护员说良注释帮助更理解程序时甚优设计文档
¹ 215:switch语句case语句果特殊情况需处理完case进入case处理必须该case语句处理完case语句前加明确注释
说明:样较清楚程序编写者意图效防止遗漏break语句
示例(注意斜体加粗部分):
case CMD_UP
ProcessUp()
break
case CMD_DOWN
ProcessDown()
break
case CMD_FWD
ProcessFwd()
if ()
{
break
}
else
{
ProcessCFW_B() now jump into case CMD_A
}
case CMD_A
ProcessA()
break
case CMD_B
ProcessB()
break
case CMD_C
ProcessC()
break
case CMD_D
ProcessD()
break
½ 21:避免行代码表达式中间插入注释
说明:非必应代码表达中间插入注释否容易代码理解性变差
½ 22:通函数程变量结构等正确命名合理组织代码结构代码成注释
说明:清晰准确函数变量等命名增加代码读性减少必注释
½ 23:代码功意图层次进行注释提供额外信息
说明:注释目解释代码目功采方法提供代码外信息帮助读者理解代码防止没必重复注释信息
示例:注释意义
* if receive_flag is TRUE *
if (receive_flag)
注释出额外信息
* if mtp receive a message from links *
if (receive_flag)
½ 24:程序块结束行右方加注释标记表明某程序块结束
说明:代码段较长特重嵌套时样做代码更清晰更便阅读
示例:参见例子
if ()
{
program code
while (index < MAX_INDEX)
{
program code
} * end of while (index < MAX_INDEX) * 指明该条while语句结束
} * end of if ()* 指明条if语句结束
½ 25:注释格式量统建议* …… *
½ 26:注释应考虑程序易读外观排版素语言中英兼建议中文非非常流利准确英文表达
说明:注释语言统影响程序易读性外观排版出维护员考虑建议中文
3 标识符命名
¹ 31:标识符命名清晰明明确含义时完整单词家基理解缩写避免产生误解
说明:较短单词通掉元音形成缩写较长单词取单词头字母形成缩写单词家公认缩写
示例:单词缩写够家基认
temp 缩写 tmp
flag 缩写 flg
statistic 缩写 stat
increment 缩写 inc
message 缩写 msg
¹ 32:命名中特殊约定缩写注释说明
说明:应该源文件开始处文件中缩写约定特特殊缩写进行必注释说明
¹ 33:特命名风格始终保持致回变化
说明:命名风格符合项目组产品组命名规前提(命名规中没规定方命名风格)
¹ 34:变量命名禁止取单字符(ijk)建议具体含义外表明变量类型数类型等ijk作局部循环变量允许
说明:变量尤局部变量果单字符表示容易敲错(i写成j)编译时检查出错误花费量查错时间
示例:面示局部变量名定义方法鉴
int liv_Width
变量名解释:
l 局部变量(Local) (:g 全局变量(Global))
i 数类型(Interger)
v 变量(Variable) (:c 常量(Const))
Width 变量含义
样防止局部变量全局变量重名
¹ 35:命名规范必须系统风格保持致项目中统采UNIX全写加划线风格写混排方式写划线混排方式作特殊标识标识成员变量全局变量m_g_加写混排方式允许
示例: Add_User允许add_userAddUserm_AddUser允许
½ 31:非必数字较奇怪字符定义标识符
示例:命名产生疑惑
#define _EXAMPLE_0_TEST_
#define _EXAMPLE_1_TEST_
void set_sls00( BYTE sls )
应改意义单词命名
#define _EXAMPLE_UNIT_TEST_
#define _EXAMPLE_ASSERT_TEST_
void set_udt_msg_sls( BYTE sls )
½ 32:软件产品应规划接口部分标识符(变量结构函数常量)命名防止编译链接时产生突
说明:接口部分标识符应该更严格限制防止突规定接口部分变量常量前加模块标识等
½ 33:正确反义词组命名具互斥意义变量相反动作函数等
说明:面软件中常反义词组
add remove begin end create destroy
insert delete first last get release
increment decrement put get
add delete lock unlock open close
min max old new start stop
next previous source target show hide
send receive source destination
cut paste up down
示例:
int min_sum
int max_sum
int add_user( BYTE *user_name )
int delete_user( BYTE *user_name )
½ 34:编译开关头文件等特殊应应避免_EXAMPLE_TEST_类划线开始结尾定义
4 读性
¹ 41:注意运算符优先级括号明确表达式操作序避免默认优先级
说明:防止阅读程序时产生误解防止默认优先级设计思想符导致程序出错
示例:列语句中表达式
word (high << 8) | low (1)
if ((a | b) && (a & c)) (2)
if ((a | b) < (c & d)) (3)
果书写
high << 8 | low
a | b && a & c
a | b < c & d
high << 8 | low ( high << 8) | low
a | b && a & c (a | b) && (a & c)
(1)(2)会出错语句易理解
a | b < c & d a | (b < c) & d(3)造成判断条件出错
¹ 42:避免易理解数字意义标识代涉物理状态者含物理意义常量应直接数字必须意义枚举宏代
示例:程序读性差
if (Trunk[index]trunk_state 0)
{
Trunk[index]trunk_state 1
program code
}
应改形式
#define TRUNK_IDLE 0
#define TRUNK_BUSY 1
if (Trunk[index]trunk_state TRUNK_IDLE)
{
Trunk[index]trunk_state TRUNK_BUSY
program code
}
½ 41:源程序中关系较紧密代码应相邻
说明:便程序阅读查找
示例:代码布局太合理
rectlength 10
char_poi str
rectwidth 5
形式书写更清晰
rectlength 10
rectwidth 5 矩形长宽关系较密切放起
char_poi str
½ 42:难懂技巧性高语句非必时
说明:高技巧语句等高效率程序实际程序效率关键算法
示例:表达式考虑周出问题较难理解
* stat_poi ++ + 1
* ++ stat_poi + 1
应分改
*stat_poi + 1
stat_poi++ 二语句功相 * stat_poi ++ + 1
++ stat_poi
*stat_poi + 1 二语句功相 * ++ stat_poi + 1
5 变量结构
¹ 51:掉没必公变量
说明:公变量增模块间耦合原应减少没必公变量降低模块间耦合度
¹ 52:仔细定义明确公变量含义作取值范围公变量间关系
说明:变量声明时应含义作取值范围进行注释说明时必应说明变量关系
¹ 53:明确公变量操作公变量函数程关系访问修改创建等
说明:明确程操作变量关系利程序进步优化单元测试系统联调代码维护等种关系说明注释文档中描述
示例:源文件中注释形式说明
RELATION System_Init Input_Rec Print_Rec Stat_Score
Student Create Modify Access Access
Score Create Modify Access Access Modify
注:RELATION操作关系System_InitInput_RecPrint_RecStat_Score四函数StudentScore两全局变量Create表示创建Modify表示修改Access表示访问
中函数Input_RecStat_Score修改变量Score变量引起函数间较耦合增加代码测试维护难度
¹ 54:公变量传递数时十分心防止赋合理值越界等现象发生
说明:公变量赋值时必应进行合法性检查提高代码性稳定性
¹ 55:防止局部变量公变量名
说明:较命名规问题动消
¹ 56:严禁未初始化变量作右值
说明:特CC++中引未赋值指针常会引起系统崩溃
½ 51:构造仅模块函数修改创建余关模块函数访问公变量防止模块函数修改创建公变量现象
说明:降低公变量耦合度
½ 52:严格形式定义移植数类型量具体硬件软件环境关系密切变量
说明:标准数类型利程序移植
示例:例子(DOSBC31环境中)移植时产生问题
void main()
{
register int index 寄存器变量
_AX 0x4000 _AXBC31提供寄存器伪变量
program code
}
½ 53:结构功单针种事务抽象
说明:设计结构时应力争结构代表种现实事务抽象时代表种结构中元素应代表事务侧面应描述没关系关系弱事务元素放结构中
示例:结构太清晰合理
typedef struct STUDENT_STRU
{
unsigned char name[8] * student's name *
unsigned char age * student's age *
unsigned char sex * student's sex as follows *
* 0 FEMALE 1 MALE *
unsigned char
teacher_name[8] * the student teacher's name *
unisgned char
teacher_sex * his teacher sex *
} STUDENT
改更合理
typedef struct TEACHER_STRU
{
unsigned char name[8] * teacher name *
unisgned char sex * teacher sex as follows *
* 0 FEMALE 1 MALE *
} TEACHER
typedef struct STUDENT_STRU
{
unsigned char name[8] * student's name *
unsigned char age * student's age *
unsigned char sex * student's sex as follows *
* 0 FEMALE 1 MALE *
unsigned int teacher_ind * his teacher index *
} STUDENT
½ 54:设计面面俱非常灵活数结构
说明:面面俱灵活数结构反容易引起误解操作困难
½ 55:结构间关系复杂
说明:两结构间关系较复杂密切应合结构
示例:两结构构造合理
typedef struct PERSON_ONE_STRU
{
unsigned char name[8]
unsigned char addr[40]
unsigned char sex
unsigned char city[15]
} PERSON_ONE
typedef struct PERSON_TWO_STRU
{
unsigned char name[8]
unsigned char age
unsigned char tel
} PERSON_TWO
两结构描述事物合成结构
typedef struct PERSON_STRU
{
unsigned char name[8]
unsigned char age
unsigned char sex
unsigned char addr[40]
unsigned char city[15]
unsigned char tel
} PERSON
½ 56:结构中元素数应适中结构中元素数考虑某种原元素组成子结构减少原结构中元素数
说明:增加结构理解性操作性维护性
示例:假认_PERSON结构元素划分
typedef struct PERSON_BASE_INFO_STRU
{
unsigned char name[8]
unsigned char age
unsigned char sex
} PERSON_BASE_INFO
typedef struct PERSON_ADDRESS_STRU
{
unsigned char addr[40]
unsigned char city[15]
unsigned char tel
} PERSON_ADDRESS
typedef struct PERSON_STRU
{
PERSON_BASE_INFO person_base
PERSON_ADDRESS person_addr
} PERSON
½ 57:仔细设计结构中元素布局排列序结构容易理解节省占空间减少引起误现象
说明:合理排列结构中元素序节省空间增加理解性
示例:结构中位域排列占较空间读性稍差
typedef struct EXAMPLE_STRU
{
unsigned int valid 1
PERSON person
unsigned int set_flg 1
} EXAMPLE
改成形式仅节省1字节空间读性变
typedef struct EXAMPLE_STRU
{
unsigned int valid 1
unsigned int set_flg 1
PERSON person
} EXAMPLE
½ 58:结构设计量考虑前兼容版升级某未应保留余(预留空间等)
说明:软件前兼容特性软件产品否成功重标志果想产品具较前兼容产品设计初应版升级保留定余产品升级时必须考虑前版种特性
½ 59:留心具体语言编译器处理数类型原关细节
说明:C语言中static局部变量存数区中生成非static局部变量堆栈中生成细节程序质量保证非常重
½ 510:编程时注意数类型强制转换
说明:进行数类型强制转换时数意义转换取值等发生变化细节考虑周留隐患
½ 511:编译系统默认数类型转换充分认识
示例:赋值数编译器产生告警值含义稍变化
char chr
unsigned short int exam
chr 1
exam chr 编译器产生告警时exam0xFFFF
½ 512:量减少没必数类型默认转换强制转换
½ 513:合理设计数定义数类型避免数间进行必类型转换
½ 514:定义数类型进行恰命名成描述性提高代码读性注意命名方式产品中统
说明:定义类型弥补编程语言提供类型少信息量足缺点程序清晰简洁
示例:参考方式声明定义数类型
面声明数类型简洁明
typedef unsigned char BYTE
typedef unsigned short WORD
typedef unsigned int DWORD
面声明数类型具更丰富含义
typedef float DISTANCE
typedef float SCORE
½ 515:声明分布式环境CPU间通信环境数结构时必须考虑机器字节序位域字节齐等问题
说明:Intel CPU68360 CPU处理位域整数时存存放序正相反
示例:假短整数结构
unsigned short int exam
typedef struct EXAM_BIT_STRU
{ * Intel 68360 *
unsigned int A1 1 * bit 0 7 *
unsigned int A2 1 * bit 1 6 *
unsigned int A3 1 * bit 2 5 *
} EXAM_BIT
Intel CPU生成短整数位域方式
存: 0 1 2 (低高字节单位)
exam exam低字节 exam高字节
存: 0 bit 1 bit 2 bit (字节位)
EXAM_BIT A1 A2 A3
68360 CPU生成短整数位域方式
存: 0 1 2 (低高字节单位)
exam exam高字节 exam低字节
存: 7 bit 6 bit 5 bit (字节位)
EXAM_BIT A1 A2 A3
说明:齐方式CPU运行效率快
示例:图long型数(图中long1)存中位置正存字边界齐时CPU存取数需访问次存long型数(图中long2)存中位置跨越字边界时CPU存取数需次访问存i960cx访问样数需读存三次(BYTESHORTBYTECPU微代码执行软件透明)齐方式CPU运行效率明显快
1 8 16 24 32
| long1 | long1 | long1 | long1 |
| | | | long2 |
| long2 | long2 | long2 | |
|
6 函数程
¹ 61:调函数错误返回码仔细全面处理
¹ 62:明确函数功精确(似)实现函数设计
¹ 63:编写重入函数时应注意局部变量(编写CC++语言重入函数时应auto缺省态局部变量寄存器变量)
说明:编写CC++语言重入函数时应static局部变量否必须特殊处理函数具重入性
¹ 64:编写重入函数时全局变量应通关中断信号量(PV操作)等手段加保护
说明:全局变量加保护函数具重入性进程调函数时关全局变量变知状态
示例:假设Examint型全局变量函数Squre_Exam返回Exam方值函数具重入性
unsigned int example( int para )
{
unsigned int temp
Exam para (**)
temp Square_Exam( )
return temp
}
函数进程调话结果未知(**)语句刚执行完外函数进程正激活新激活进程执行函数时Exam赋para值控制重新回temp Square_Exam( )计算出temp预想中结果函数应改进
unsigned int example( int para )
{
unsigned int temp
[申请信号量操作] 申请信号量说明外进程正处
Exam para Exam赋值计算方程中(正
temp Square_Exam( ) 信号)进程必须等释放信号继
[释放信号量操作] 续执行申请信号继续执行
进程必须等进程释放信号量
信号
return temp
}
¹ 65:项目组应明确规定接口函数参数合法性检查应函数调者负责接口函数身负责缺省函数调者负责
说明:模块间接口函数参数合法性检查问题两极端现象:调者调者参数均作合法性检查结果遗漏合法性检查必处理程造成问题隐患调者调者均参数进行合法性检查种情况会造成问题产生冗余代码降低效率
½ 61:防止函数参数作工作变量
说明:函数参数作工作变量错误改变参数容危险必须改变参数先局部变量代该局部变量容赋该参数
示例:函数实现太
void sum_data( unsigned int num int *data int *sum )
{
unsigned int count
*sum 0
for (count 0 count < num count++)
{
*sum + data[count] sum成工作变量太
}
}
改更
void sum_data( unsigned int num int *data int *sum )
{
unsigned int count
int sum_temp
sum_temp 0
for (count 0 count < num count ++)
{
sum_temp + data[count]
}
*sum sum_temp
}
½ 62:函数规模量限制200行
说明:包括注释空格行
½ 63:函数仅完成件功
½ 64:简单功编写函数
说明:然仅两行完成功编函数象没必函数功明确化增加程序读性方便维护测试
示例:语句功明显
value ( a > b ) a b
改清晰
int max (int a int b)
{
return ((a > b) a b)
}
value max (a b)
改
#define MAX (a b) (((a) > (b)) (a) (b))
value MAX (a b)
½ 65:设计途面面俱函数
说明:功集身函数函数理解测试维护等变困难
½ 66:函数功应该预测输入数相应产生样输出
说明:带部存储器函数功预测输出取决部存储器(某标记)状态样函数易理解利测试维护CC++语言中函数static局部变量函数部存储器函数功预测然某函数返回值指针类型时必须STATIC局部变量址作返回值AUTO类返回错针
示例:函数返回值(功)预测
unsigned int integer_sum( unsigned int base )
{
unsigned int index
static unsigned int sum 0 注意static类型
改auto类型函数变预测
for (index 1 index < base index++)
{
sum + index
}
return sum
}
½ 67:量编写赖函数部实现函数
说明:条函数独立性基求目前部分高级语言结构化通具体语言语法求编译器功基防止种情况发生汇编语言中灵活性函数出现种情况
示例:DOSTASM汇编程序例子程Print_Msg实现赖Input_Msg具体实现种程序非结构化难维护修改
程序代码
proc Print_Msg 程(函数)Print_Msg
程序代码
jmp LABEL
程序代码
endp
proc Input_Msg 程(函数)Input_Msg
程序代码
LABEL
程序代码
endp
½ 68:避免设计参数函数参数接口中掉
说明:目减少函数间接口复杂度
½ 69:非调度函数应减少防止控制参数量数参数
说明:建议目防止函数间控制耦合调度函数指根输入消息类型控制命令启动相应功实体(函数程)身完成具体功控制参数指改变函数功行参数函数根参数决定具体样工作非调度函数控制参数增加函数间控制耦合函数间耦合度增函数功唯
示例:函数构造太合理
int add_sub( int a int b unsigned char add_sub_flg )
{
if (add_sub_flg INTEGER_ADD)
{
return (a + b)
}
else
{
return (a b)
}
}
分两函数清晰
int add( int a int b )
{
return (a + b)
}
int sub( int a int b )
{
return (a b)
}
½ 610:检查函数参数输入效性
½ 611:检查函数非参数输入效性数文件公变量等
说明:函数输入两种:种参数输入种全局变量数文件输入非参数输入函数输入前应进行必检查
½ 612:函数名应准确描述函数功
½ 613:动宾词组执行某操作函数命名果OOP方法动词(名词象身)
示例:参方式命名函数
void print_record( unsigned int rec_ind )
int input_record( void )
unsigned char get_current_color( void )
建议614:避免意义含义清动词函数命名
说明:避免含义清动词processhandle等函数命名动词没说明具体做什
建议615:函数返回值清楚明者容易忽视错误情况
说明:函数种出错返回值意义清晰明准确防止者误理解错误忽视错误返回码
½ 616:非必函数返回值类型变量编译系统默认转换方式强制转换方式作返回值返回
½ 617:函数调点显易懂容易理解
½ 618:调函数填写参数时应量减少没必默认数类型转换强制数类型转换
说明:数类型转换少存危险
½ 619:避免函数中必语句防止程序中垃圾代码
说明:程序中垃圾代码仅占额外空间常常影响程序功性程序测试维护等造成必麻烦
½ 620:防止没关联语句放函数中
说明:防止函数程出现机聚机聚指没关联关联弱语句放函数程中机聚函数程维护测试升级等造成便时函数程功明确机聚函数常常容易出现种应场合需改进函数种应场合允许种改进陷入困境
编程时常遇函数中相代码许开发员愿代码提出构成新函数代码关联较完成功种构造合理否种构造产生机聚函数
示例:函数种机聚
void Init_Var( void )
{
Rectlength 0
Rectwidth 0 * 初始化矩形长宽 *
Pointx 10
Pointy 10 * 初始化点坐标 *
}
矩形长宽点坐标基没关系函数机聚
应分两函数:
void Init_Rect( void )
{
Rectlength 0
Rectwidth 0 * 初始化矩形长宽 *
}
void Init_Point( void )
{
Pointx 10
Pointy 10 * 初始化点坐标 *
}
½ 621:果段代码重复做件事情函数划分存问题
说明:段代码语句间实质性关联完成件功考虑段代码构造成新函数
½ 622:功明确较函数特仅级函数调时应考虑合级函数中必单独存
说明:模块中函数划分般会函数间接口变复杂函数特扇入低功明确函数值单独存
½ 623:设计高扇入合理扇出(7)函数
说明:扇出指函数直接调(控制)函数数目扇入指少级函数调
扇出表明函数分复杂需控制协调级函数扇出总1表明函数调层次样利程序阅读函数结构分析程序运行时会系统资源堆栈空间等造成压力函数较合理扇出(调度函数外)通常35扇出太般缺乏中间层次适增加中间层次函数扇出太级函数进步分解函数合级函数中然分解合函数时改变实现功违背函数间独立性
扇入越表明函数级函数越样函数效率高违背函数间独立性单纯追求高扇入公模块中函数底层函数应该较高扇入
较良软件结构通常顶层函数扇出较高中层函数扇出较少底层函数扇入公模块中
½ 624:减少函数身函数间递调
说明:递调特函数间递调(A>B>C>A)影响程序理解性递调般占较系统资源(栈空间)递调程序测试定影响非某算法功实现方便应减少没必递调
½ 625:仔细分析模块功性需求进步细分时必画出关数流图进行模块函数划分组织
说明:函数划分组织模块实现程中关键步骤划分出合理函数结构关系模块终效率维护性测性等根模块功图数流图映射出函数结构常方法
½ 626:改进模块中函数结构降低函数间耦合度提高函数独立性代码读性效率维护性优化函数结构时遵守原:
(1)影响模块功实现
(2)仔细考查模块函数出错处理模块性求进行完善
(3)通分解合函数改进软件结构
(4)考查函数规模进行分解
(5)降低函数间接口复杂度
(6)层次函数调较合理扇入扇出
(7)函数功应预测
(8)提高函数聚(单功函数聚高)
说明:初步划分函数结构应进行改进优化更合理
½ 627:务操作系统环境编程注意函数重入性构造
说明:重入性指函数务进程调务操作系统中函数否具重入性非常重进程函数必条件外编译器否提供重入函数库服务操作系统关操作系统务时编译器提供重入函数库DOSBCMSC等具备重入函数库DOS单户单务操作系统
½ 628:避免BOOL参数
说明:原二BOOL参数值意义TUREFALSE含义非常模糊调时难知道该参数底传达什意思二BOOL参数值利扩充NULL意义单词
½ 629: 提供返回值函数引时返回值
½ 630:程(函数)中较长变量(般结构成员)较引时意义相宏代
说明:样增加编程效率程序读性
示例:某程中较引TheReceiveBuffer[FirstSocket]byDataPtr
通宏定义代:
# define pSOCKDATA TheReceiveBuffer[FirstScoket]byDataPtr
7 测性
¹ 71:项目组产品组套统集成测试系统联调准备调测开关相应印函数详细说明
说明:规针项目组产品组
¹ 72:项目组产品组调测印出信息串格式统形式信息串中少模块名(源文件名)行号
说明:统调测信息格式便集成测试
¹ 73:编程时单元测试选择恰测试点仔细构造测试代码测试例时出明确注释说明测试代码部分应作(模块中)子模块方便测试代码模块中安装拆卸(通调测开关)
说明:单元测试准备
¹ 74:进行集成测试系统联调前构造测试环境测试项目测试例时仔细分析优化测试例提高测试效率
说明:测试例应模拟出程序遇边界值种复杂环境极端情况等
¹ 75:断言发现软件问题提高代码测性
说明:断言某种假设条件进行检查(理解条件成立动作否应报告)快速发现定位软件问题时系统错误进行动报警断言系统中隐藏深手段极难发现问题进行定位缩短软件问题定位时间提高系统测性实际应时根具体情况灵活设计断言
示例:面C语言中断言宏设计(中NULL0L)
#ifdef _EXAM_ASSERT_TEST_ 断言测试
void exam_assert( char * file_name unsigned int line_no )
{
printf( \n[EXAM]Assert failed s line u\n
file_name line_no )
abort( )
}
#define EXAM_ASSERT( condition )
if (condition) 条件成立动作
NULL
else 否报告
exam_assert( __FILE__ __LINE__ )
#else 断言测试
#define EXAM_ASSERT(condition) NULL
#endif * end of ASSERT *
¹ 76:断言检查程序正常运行时应发生调测时发生非法情况
¹ 77:断言检查终产品肯定会出现必须处理错误情况
说明:断言处理应该发生错误情况会发生必须处理情况写防错程序断言某模块收模块链路消息消息合理性进行检查程正常错误检查断言实现
¹ 78:较复杂断言加明确注释
说明:复杂断言加注释澄清断言含义减少必误
¹ 79:断言确认函数参数
示例:假设某函数参数中指针指针前检查
int exam_fun( unsigned char *str )
{
EXAM_ASSERT( str NULL ) 断言检查假设指针空条件
other program code
}
¹ 710:断言保证没定义特性功
示例:假设某通信模块设计时准备提供连接连接 两种业务前版中仅实现连接业务版正式发行版中户(层模块)应产生连接业务请求测试时断言检查户否连接业务
#define EXAM_CONNECTIONLESS 0 连接业务
#define EXAM_CONNECTION 1 连接业务
int msg_process( EXAM_MESSAGE *msg )
{
unsigned char service * message service class *
EXAM_ASSERT( msg NULL )
service get_msg_service_class( msg )
EXAM_ASSERT( service EXAM_CONNECTION ) 假设连接业务
other program code
}
¹ 711:断言程序开发环境(OSCompilerHardware)假设进行检查
说明:程序运行时需软硬件环境配置求断言检查必须段专门代码处理断言仅程序开发环境中假设配置某版软硬件否具某种功假设进行检查某网卡否系统运行环境中配置应程序中正式代码检查网卡否具某设想功断言检查
编译器提供功特性假设断言检查原软件终产品(运行代码机器码)编译器已没直接关系软件运行程中(注意编译程中)会应该编译器功提出需求
示例:断言检查编译器int型数占存空间否2
EXAM_ASSERT( sizeof( int ) 2 )
¹ 712:正式软件产品中应断言调测代码掉(关调测开关关掉)
说明:加快软件运行速度
¹ 713:软件系统中设置取消关测试手段软件实现功等产生影响
说明:测试代码软件关掉测试代码软件功行应致
¹ 714:调测开关切换软件DEBUG版正式版时存正式版DEBUG版源文件减少维护难度
¹ 715:软件DEBUG版发行版应该统维护允许分家时刻注意保证两版实现功致性
½ 71:编写代码前应预先设计程序调试测试方法手段设计种调测开关相应测试代码印函数等
说明:程序调试测试软件生存周期中重阶段软件进行较全面高率测试找出软件中错误成关键问题编写源代码前套较完善测试计划外应设计出系列代码测试手段单元测试集成测试系统联调提供方便
½ 72:调测开关应分级类型
说明:调测开关设置分类应方面考虑:针模块系统某部分代码调测针模块系统某功调测出某种目性容量等测试样做便软件功调测便模块单元测试系统联调等
½ 73:编写防错程序然处理错误断言宣布发生错误
示例:假某模块收通信链路消息应消息合法性进行检查消息类通信协议中规定应进行出错处理断言报告例
#ifdef _EXAM_ASSERT_TEST_ 断言测试
* Notice this function does not call 'abort' to exit program *
void assert_report( char * file_name unsigned int line_no )
{
printf( \n[EXAM]Error Report s line u\n
file_name line_no )
}
#define ASSERT_REPORT( condition )
if ( condition ) 条件成立动作
NULL
else 否报告
assert_report ( __FILE__ __LINE__ )
#else 断言测试
#define ASSERT_REPORT( condition ) NULL
#endif * end of ASSERT *
int msg_handle( unsigned char msg_name unsigned char * msg )
{
switch( msg_name )
{
case MSG_ONE
消息MSG_ONE处理
return MSG_HANDLE_SUCCESS
合法消息处理
default
消息出错处理
ASSERT_REPORT( FALSE ) 合法消息成立报告
return MSG_HANDLE_ERROR
}
}
8 程序效率
¹ 81:编程时常注意代码效率
说明:代码效率分全局效率局部效率时间效率空间效率全局效率站整系统角度系统效率局部效率站模块函数角度效率时间效率程序处理输入务需时间长短空间效率程序需存空间机器代码空间数空间栈空间等
¹ 82:保证软件系统正确性稳定性读性测性前提提高代码效率
说明:味追求代码效率软件正确性稳定性读性测性造成影响
¹ 83:局部效率应全局效率服务提高局部效率全局效率造成影响
¹ 84:通系统数结构划分组织改进程序算法优化提高空间效率
说明:种方式解决软件空间效率根办法
示例:记录学生学成绩结构合理
typedef unsigned char BYTE
typedef unsigned short WORD
typedef struct STUDENT_SCORE_STRU
BYTE name[8]
BYTE age
BYTE sex
BYTE class
BYTE subject
float score
} STUDENT_SCORE
位学生科学成绩结构占较空间应改进(分两结构)总存贮空间变操作变更方便
typedef struct STUDENT_STRU
{
BYTE name[8]
BYTE age
BYTE sex
BYTE class
} STUDENT
typedef struct STUDENT_SCORE_STRU
{
WORD student_index
BYTE subject
float score
} STUDENT_SCORE
¹ 85:循环体工作量化
说明:应仔细考虑循环体语句否放循环体外循环体工作量提高程序时间效率
示例:代码效率高
for (ind 0 ind < MAX_ADD_NUMBER ind++)
{
sum + ind
back_sum sum * backup sum *
}
语句back_sum sum完全放for语句
for (ind 0 ind < MAX_ADD_NUMBER ind++)
{
sum + ind
}
back_sum sum * backup sum *
½ 81:仔细分析关算法进行优化
½ 82:仔细考查分析系统模块处理输入(事务消息等)方式加改进
½ 83:模块中函数划分组织方式进行分析优化改进模块中函数组织结构提高程序效率
说明:软件系统效率算法处理务方式系统功函数结构关系仅代码功夫般解决根问题
½ 84:编程时时留心代码效率优化代码时考虑周全
½ 85:应花时间拼命提高调频繁函数代码效率
说明:代码优化提高效率考虑周引起严重果
½ 86:仔细构造直接汇编编写调频繁性求极高函数
说明:编译系统产生机器码方式硬件系统较熟悉时汇编嵌入方式嵌入汇编提高时间空间效率存定风险
½ 87:保证程序质量前提通压缩代码量掉必代码减少必局部全局变量提高空间效率
说明:种方式提高空间效率起定作解决根问题
½ 88:重循环中应忙循环放层
说明:减少CPU切入循环层次数
示例:代码效率高
for (row 0 row < 100 row++)
{
for (col 0 col < 5 col++)
{
sum + a[row][col]
}
}
改方式提高效率
for (col 0 col < 5 col++)
{
for (row 0 row < 100 row++)
{
sum + a[row][col]
}
}
½ 89:量减少循环嵌套层次
½ 810:避免循环体含判断语句应循环语句置判断语句代码块中
说明:目减少判断次数循环体中判断语句否移循环体外视程序具体情况言般情况循环变量关判断语句移循环体外关
示例:代码效率稍低
for (ind 0 ind < MAX_RECT_NUMBER ind++)
{
if (data_type RECT_AREA)
{
area_sum + rect_area[ind]
}
else
{
rect_length_sum + rect[ind]length
rect_width_sum + rect[ind]width
}
}
判断语句循环变量关改进减少判断次数
if (data_type RECT_AREA)
{
for (ind 0 ind < MAX_RECT_NUMBER ind++)
{
area_sum + rect_area[ind]
}
}
else
{
for (ind 0 ind < MAX_RECT_NUMBER ind++)
{
rect_length_sum + rect[ind]length
rect_width_sum + rect[ind]width
}
}
½ 811:量法方法代法特浮点运算中法
说明:浮点运算法占较CPU资源
示例:表达式运算占较CPU资源
#define PAI 31416
radius circle_length (2 * PAI)
应浮点法改浮点法
#define PAI_RECIPROCAL (1 31416 ) 编译器编译时生成具体浮点数
radius circle_length * PAI_RECIPROCAL 2
½ 812:味追求紧凑代码
说明:紧凑代码代表高效机器码
9 质量保证
¹ 91:软件设计程中构筑软件质量
¹ 92:代码质量保证优先原
(1)正确性指程序实现设计求功
(2)稳定性安全性指程序稳定安全
(3)测试性指程序具良测试性
(4)规范读性指程序书写风格命名规等符合规范
(5)全局效率指软件系统整体效率
(6)局部效率指某模块子模块函数身效率
(7)表达方式方便性指编程惯
¹ 93:引属存贮空间
说明:模块封装较般会发生非法引空间
¹ 94:防止引已释放存空间
说明:实际编程程中稍留心会出现模块中释放某存块(C语言指针)模块某时刻防止种情况发生
¹ 95:程函数中分配存程函数退出前释放
¹ 96:程函数中申请(开文件)文件句柄程函数退出前关闭
说明:分配存释放文件句柄关闭较常见错误稍注意发生类错误会引起严重果难定位
示例:函数退出前没分配存释放
typedef unsigned char BYTE
int example_fun( BYTE gt_len BYTE *gt_code )
{
BYTE *gt_buf
gt_buf (BYTE *) malloc (MAX_GT_LENGTH)
program code include check gt_buf if or not NULL
* global title length error *
if (gt_len > MAX_GT_LENGTH)
{
return GT_LENGTH_ERROR 忘释放gt_buf
}
other program code
}
应改
int example_fun( BYTE gt_len BYTE *gt_code )
{
BYTE *gt_buf
gt_buf (BYTE * ) malloc ( MAX_GT_LENGTH )
program code include check gt_buf if or not NULL
* global title length error *
if (gt_len > MAX_GT_LENGTH)
{
free( gt_buf ) 退出前释放gt_buf
return GT_LENGTH_ERROR
}
other program code
}
¹ 97:防止存操作越界
说明:存操作指数组指针存址等操作存操作越界软件系统错误果非常严重进行操作时定仔细心
示例:假设某软件系统10户时户号110程序存问题
#define MAX_USR_NUM 10
unsigned char usr_login_flg[MAX_USR_NUM]
void set_usr_login_flg( unsigned char usr_no )
{
if (usr_login_flg[usr_no])
{
usr_login_flg[usr_no] TRUE
}
}
usr_no10时usr_login_flg越界采方式解决
void set_usr_login_flg( unsigned char usr_no )
{
if (usr_login_flg[usr_no 1])
{
usr_login_flg[usr_no 1] TRUE
}
}
¹ 98:认真处理程序遇种出错情况
¹ 99:系统运行初初始化关变量运行环境防止未初始化变量引
¹ 910:系统运行初加载系统中数进行致性检查
说明:致数容易系统进入混乱状态知状态
¹ 911:严禁意更改模块系统关设置配置
说明:编程时心欲更改属模块关设置常量数组等
¹ 912:意改变模块接口
¹ 913:充分解系统接口系统提供功
示例:B型机模块操作系统接口函数中模块负责编写初始化程程软件系统加载完成操作系统发送初始化消息调度涉初始化消息类型消息发送序问题特消息序没搞清楚开始编程容易引起严重果示例引B型出现实际代码中FID_FETCH_DATAFID_INITIAL初始化消息类型注意B型机系统FID_FETCH_DATA前发送FID_INITIAL
MID alarm_module_list[MAX_ALARM_MID]
int FAR SYS_ALARM_proc( FID function_id int handle )
{
_UI i j
switch ( function_id )
{
program code
case FID_INITAIL
for (i 0 i < MAX_ALARM_MID i++)
{
if (alarm_module_list[i] BAM_MODULE **)
|| (alarm_module_list[i] LOCAL_MODULE)
{
for (j 0 j < ALARM_CLASS_SUM j++)
{
FAR_MALLOC( )
}
}
}
program code
break
case FID_FETCH_DATA
program code
Get_Alarm_Module( ) 初始化alarm_module_list
break
program code
}
}
FID_INITIALFID_FETCH_DATA前执行初始化alarm_module_listFID_FETCH_DATA中进行FID_INITIAL中(**)处引alarm_module_list变量时没初始化严重错误
应改正:Get_Alarm_Module函数放FID_INITIAL中(**)前必须考虑(**)处判断语句否(alarm_module_list变量)方式代者否取消判断语句
¹ 914:编程时防止差1错误
说明:类错误般<误写成<>误写成>等造成引起果情况严重编程时定方心编完程序应操作符进行彻底检查
¹ 915:时刻注意易混淆操作符编完程序应头尾检查遍操作符防止拼写错误
说明:形式相操作符容易引起误CC++中|||&&&等拼写错编译器定够检查出
示例:&写成&&反
ret_flg (pmsg>ret_flg & RETURN_MASK)
写:
ret_flg (pmsg>ret_flg && RETURN_MASK)
rpt_flg (VALID_TASK_NO( taskno ) && DATA_NOT_ZERO( stat_data ))
写:
rpt_flg (VALID_TASK_NO( taskno ) & DATA_NOT_ZERO( stat_data ))
¹ 916:话if语句量加else分支没else分支语句心switch语句必须default分支
¹ 917:Unix线程中子线程退出必需采动退出方式子线程应return出口
¹ 918:滥goto语句
说明:goto语句会破坏程序结构性非确实需goto语句
½ 91:硬件操作系统关系语句建议标准语句提高软件移植性重性
½ 92:非满足特殊需求避免嵌入式汇编
说明:程序中嵌入式汇编般移植性较影响
½ 93:精心构造划分子模块接口部分核部分合理组织子模块提高核部分移植性重性
说明:产品中某功相模块做核部分完全基致产品测试维护产品升级会帮助
½ 94:精心构造算法性效率进行测试
½ 95:较关键算法算法确认
½ 96:时刻注意表达式否会溢溢
示例:程序造成变量溢
unsigned char size
while (size > 0) 出现溢
{
program code
}
size等0时减1会00xFF程序死循环应修改
char size unsigned char 改char
while (size > 0)
{
program code
}
½ 97:变量时注意边界值情况
示例:C语言中字符型变量效值范围128127表达式计算存定风险
char chr 127
int sum 200
chr + 1 127chr边界值加1chr溢128128
sum + chr sum结果32872
chrsum种类型表达式方式书写会
sum sum + chr + 1
½ 98:留心程序机器码(指令空间数空间堆栈空间等)否超出系统关限制
½ 99:户提供良接口界面户较充分解系统部运行状态关系统出错情况
½ 910:系统应具定容错力错误事件(户误操作等)进行动补救
½ 911:具危险性操作代码(写硬盘删数等)仔细考虑防止数硬件等安全构成危害提高系统安全性
½ 912:第三方提供软件开发工具包控件时注意点:
(1)充分解应接口环境时注意事项
(2)分相信正确性
(3)非必熟悉第三方工具包控件
说明:工具包控件加快程序开发速度节省时间前定较充分解时第三方工具包控件存问题
½ 913:资源文件(语言版支持)果资源语言敏感应该资源源代码文件脱离具体方法面种:单独资源文件DLL文件单独描述文件(数库格式)
10 代码编辑编译审查
¹ 101:开编译器告警开关程序进行编译
¹ 102:产品软件(项目组)中统编译开关选项
¹ 103:通代码走读审查方式代码进行检查
说明:代码走读程序编程风格注释命名等编程时易出错容进行检查开发员开发员交叉方式进行代码审查程序实现功程序稳定性安全性性等进行检查评审通审交叉审核指定部门抽查等方式进行
¹ 104:测试部测试产品前应代码进行抽查评审
½ 101:编写代码时注意时保存定期备份防止断电硬盘损坏等原造成代码丢失
½ 102:产品软件(项目组)相编辑器相设置选项
说明:项目组采相智语言编辑器Muiti EditorVisual Editor等设计套缩进宏注释宏等缩进等问题交编辑器处理
½ 103:心编辑器提供块拷贝功编程
说明:某段代码段代码处理功相似时许开发员编辑器提供块拷贝功完成段代码编写程序功相变量采表达式等功命名相块拷贝时注意修改相应程序外定变量仔细查遍改成正确应指编译器查出种错误全局变量时某种错误隐藏
½ 104:合理设计软件系统目录方便开发员
说明:方便合理软件系统目录提高工作效率目录构造原方便关源程序存储查询编译链接等工作时目录中应具工作目录编译链接等工作应目录中进行工具目录关文件编辑器文件查找等工具存放目录中
½ 105:某语句编译产生告警果认正确应通某种手段掉告警信息
说明:Borland CC++中#pragma warn关掉开某告警
示例:
#pragma warn rvl 关闭告警
int examples_fun( void )
{
程序return语句
}
#pragma warn +rvl 开告警
编译函数examples_fun时应产生函数应返回值告警关掉告警信息显示编译时会产生告警提示
½ 106:代码检查工具(C语言PCLint)源程序检查
½ 107:软件工具( LogiSCOPE)进行代码审查
11 代码测试维护
¹ 111:单元测试求少达语句覆盖
¹ 112:单元测试开始踪条语句观察数流变量变化
¹ 113:清理整理优化代码审查测试
¹ 114:代码版升级严格测试
¹ 115:工具软件代码版进行维护
¹ 116:正式版软件修改应详细文档记录
½ 111:发现错误立修改记录
½ 112:关键代码汇编级踪
½ 113:仔细设计分析测试例测试例覆盖情况提高测试例效率
½ 114:模拟出程序种出错情况出错处理代码进行充分测试
½ 115:仔细测试代码处理数变量边界情况
½ 116:保留测试信息便分析总结验进行更充分测试
½ 117:应通试解决问题应寻找问题根原
½ 118:动消失错误进行分析搞清楚错误消失
½ 119:修改错误仅治表更治
½ 1110:测试时应设法少发生事件常发生
½ 1111:明确模块函数处理事件常发生
½ 1112: 坚持编码阶段代码进行彻底单元测试等测试工作发现问题
½ 1113:代码运行机性(掉数代码防止注意函数中部寄存器等)函数运行结果预测出现错误现
12 宏
¹ 121:宏定义表达式时完备括号
示例:定义宏存定风险
#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))
¹ 122宏定义条表达式放括号中
示例:面语句宏第条表达式执行说明问题for语句书写稍符规范
#define INTI_RECT_VALUE( a b )\
a 0\
b 0
for (index 0 index < RECT_TOTAL_NUM index++)
INTI_RECT_VALUE( recta rectb )
正确法应:
#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 )
}
¹ 123宏时允许参数发生变化
示例:法导致错误
#define SQUARE( a ) ((a) * (a))
int a 5
int b
b SQUARE( a++ ) 结果:a 7执行两次增1
正确法:
b SQUARE( a )
a++ 结果:a 6执行次增1
_
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性! 该内容是文档的文本内容,更好的格式请下载文档