《高质量编程规范》ppt课件_第1页
《高质量编程规范》ppt课件_第2页
《高质量编程规范》ppt课件_第3页
《高质量编程规范》ppt课件_第4页
《高质量编程规范》ppt课件_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、上章回想上章回想哈希函数的构造方法有那些哈希表中处置冲突的方法有那些高质量编程规范高质量编程规范第八章第八章预习检查预习检查C言语要阅历哪几个编译过程如何恳求链表单元,及释放链表单元实现单链表插入的根本语法简述一下快速排序根本实际要点课程目的课程目的本章概述论述如何进展高质量的编程,以及本卷须知本章目的了解高质量编程留意的方方面面从代码风格,算法,方便调试,性能等。重点内存分配与释放,悬挂指针本章构造本章构造程序员的态度程序员的态度高质量编程规范高质量编程规范微观上高质量微观上高质量宏观上高质量宏观上高质量8.1 程序员的态度程序员的态度程序员的弱点不太情愿测试本人的代码 不情愿REVIEW团

2、队队员的代码程序员重点保证本人的代码没有 BUG 来 8.1 程序员的态度程序员的态度程序员本身可以在程序生成的流程 详细设计 编写代码单元测试 功能测试 代码 REVIEW 8.1.1 编码的风格编码的风格版权和版本的声明头文件的构造定义文件的构造头文件的作用目录构造命名规那么注释规那么/* Copyright (c) 2001,上海贝尔网络运用事业部上海贝尔网络运用事业部* All rights reserved.* * 文件称号:文件称号:filename.h* 文件标识:见配置管理方案书文件标识:见配置管理方案书* 摘摘 要:简要描画本文件的内容要:简要描画本文件的内容* * 当前版本

3、:当前版本:1.1* 作作 者:输入作者或修正者名字者:输入作者或修正者名字* 完成日期:完成日期:2001年年7月月20日日* 取代版本:取代版本:1.0 * 原作者原作者 :输入原作者或修正者名字:输入原作者或修正者名字* 完成日期:完成日期:2001年年5月月10日日8.1.1.1 版权和版本的声明版权和版本的声明版权和版本的声明位于头文件和定义文件的开头,主要内容有:1版权信息。2文件称号,标识符,摘要。3当前版本号,作者/修正者,完成日期。4版本历史信息。范例8.1.1.2头文件的构造头文件的构造头文件由三部分内容组成:头文件开头处的版权和版本声明。预处置块。函数和类构造声明等。范例

4、为了防止头文件被反复援用,该当用ifndef/define/endif构造产生预处置块。用 #include 格式来援用规范库的头文件编译器将从规范库目录开场搜索。用 #include “filename.h 格式来援用非规范库的头文件编译器将从用户的任务目录开场搜索。头文件中只存放“声明而不存放“定义不提倡运用全局变量,尽量不要在头文件中出景象extern int value 这类声明。8.1.1.3定义文件的构造定义文件的构造定义文件有三部分内容:定义文件开头处的版权和版本声明对一些头文件的援用程序的实现体包括数据和代码范例/ 版权和版本声明版权和版本声明#include “graphic

5、s.h / 援用头文件援用头文件/ 全局函数的实现体全局函数的实现体void Function1()8.1.1.4 头文件的作用头文件的作用经过头文件来调用库功能头文件能加强类型平安检查8.1.1.5 目录构造目录构造特点:便于维护通常应将头文件和定义文件分别保管于不同的目录加强信息隐藏:假设某些头文件是私有的,它不会被用户的程序直接援用,那么没有必要公开其“声明范例: Network 工程建立三个目录 source:存放工程源文件,如:server.c Client.c Include:存放工程头文件,如:server.h Client.h Lib:存放工程库文件,如:tipr.so std

6、io.so8.1.1.6 命名规那么命名规那么主要思想:在变量和函数名中参与前缀以增进人们对程序的了解详细规那么:标识符该当直观且可以拼读,可望文知意,不用进展“解码。标识符的长度该当符合“min-length & max-information原那么命名规那么尽量与所采用的操作系统或开发工具的风格坚持一致程序中不要出现仅靠大小写区分的类似的标识符程序中不要出现标识符完全一样的部分变量和全局变量变量的名字该当运用“名词或者“描画词名词用正确的反义词组命名具有互斥意义的变量或相反动作的函数等8.1.2 程序的版式程序的版式空行代码行代码行内的空格代码对齐长行拆分修饰符的位置注释8.1.2

7、.1 空行空行空行起着分隔程序段落的作用。空行得体不过多也不过少将使程序的规划更加明晰。空行不会浪费内存空行规那么每个函数定义终了之后都要加空行在一个函数体内,逻揖上亲密相关的语句之间不加空行,其它地方应加空行分隔。8.1.2.2 代码行规那么代码行规那么一行代码只做一件事情如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加。尽能够在定义变量的同时初始化该变量就近原那么8.1.2.3 代码行内的空格代码行内的空格 关键字之后要留空格函数名之后不要留空格,紧跟左括号,以与关键字区别向

8、后紧跟,、,、;向前紧跟,紧跟处不留空格,之后要留空格二元操作符的前后该当加空格。一元操作符前后不加空格。象“、“.、“-这类操作符前后不加空格。8.1.2.4 对齐和拆分规那么对齐和拆分规那么对齐规那么程序的分界符和应独占一行并且位于同一列,同时与援用它们的语句左对齐 之内的代码块在右边数格处左对齐。长行拆分规那么代码行最大长度宜控制在70至80个字符以内长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首以便突出操作符。拆分出的新行要进展适当的缩进,使排版整齐,语句可读8.1.2.5 长行拆分规那么长行拆分规那么 代码行最大长度宜控制在70至80个字符以内 长表达式要在低优先级操作符

9、处拆分成新行,操作符放在新行之首以便突出操作符 例:if (very_longer_variable1 = very_longer_variable12)& (very_longer_variable3 = very_longer_variable14)& (very_longer_variable5 = b & c d & c + f = g + h ; 不要有多用途的复合表达式 d = (a = b + c) + r ; 不要把程序中的复合表达式与“真正的数学表达式混淆 if (a b c) 与 if (ab) & (b=或或“=-EPSINON)

10、& (x=EPSINON) 其中其中EPSINON是允许的误差即精度。是允许的误差即精度。 8.2.1.3 If语句语句指针变量与零值比较指针变量与零值比较 指针变量用指针变量用“=或或“!=与与NULL比较比较 例子:例子:与零值比较的规范与零值比较的规范if语句如下:语句如下:if (p = NULL)/ p与与NULL显式比较,强调显式比较,强调p是指针变量是指针变量if (p != NULL)不要写成不要写成if (p = 0) / 容易让人误解容易让人误解p是整型变量是整型变量if (p != 0) 或者或者 if (p)/ 容易让人误解容易让人误解p是布尔变量是布尔变量if

11、 (!p)8.2.1.4 运用运用const提高函数的强壮性提高函数的强壮性 const 用法:定义常量 修饰函数的参数 修饰函数的前往值 修饰函数的定义体 8.2.1.4.1 用用const修饰函数的参数修饰函数的参数const只能修饰输入参数 特点假设输入参数采用“指针传送,那么加const修饰可以防止不测地改动该指针,起到维护作用 例:void StringCopy(char *strDestination, const char *strSource); 假设输入参数采用“援用传送 , 可以防止修正参数值的值传送void Func(const A &a) 8.2.1.4.2 用

12、用const修饰函数的前往值修饰函数的前往值 假设给以“指针传送方式的函数前往值加const修饰,那么函数前往值即指针内容不能被修正例如函数const char * GetString(void);如下语句将出现编译错误:char *str = GetString();正确的用法是const char *str = GetString();8.3.1 防止内存走漏防止内存走漏 内存分配方式 malloc/free 的运用要点 常见的内存错误及其对策 援用与指针的比较 指针与数组的对比 指针参数是如何传送内存的动态内存自动释放 杜绝“野指针 8.3.1.1内存分配方式内存分配方式 内存分配方式有

13、三种:从静态存储区域分配 在栈上创建 从堆上分配,亦称动态内存分配 malloc或new free或delete 8.3.1.2 malloc/free 的运用要点的运用要点 malloc语法:void * malloc(size_t size); 作用:恳求一块长度为length的整数类型的内存 例子:int *p = (int *) malloc(sizeof(int) * length) Free语法:void free( void * memblock ) 作用:释放内存 例子:freep假设p是NULL指针,那么free对p无论操作多少次都不会出问题假设p不是NULL指针,那么fre

14、e对p延续操作两次就会导致程序运转错误。8.3.1.3 常见的内存错误及其对策常见的内存错误及其对策 常见的内存错误 内存分配未胜利,却运用了它 内存分配虽然胜利,但是尚未初始化就援用它 内存分配胜利并且曾经初始化,但操作越过了内存的边境 忘记了释放内存,呵斥内存泄露 释放了内存却继续运用它 8.3.1.3 常见的内存错误及其对策常见的内存错误及其对策 内存管理的规那么 用malloc之后,应该立刻检查指针值能否为NULL。防止运用指针值为NULL的内存。不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值运用。防止数组或指针的下标越界,特别要留意发生“多1或者“少1操作。动态内存的

15、恳求与释放必需配对,防止内存走漏。用free释放了内存之后,立刻将指针设置为NULL,防止产生“野指针。8.3.1.5 指针与数组的对比指针与数组的对比 差别数组:要么在静态存储区被创建如全局数组,要么在栈上被创建 数组名对应着而不是指向一块内存其地址与容量在生命期内坚持不变只需数组的内容可以改动 指针:随时指向恣意类型的内存块 动态生存在数据堆8.3.1.5 指针与数组的对比指针与数组的对比 差别内存的容量大小例:1例2char a = hello world; char *p = a; sizeof(a) ?/ 12字节字节 sizeof(p) ?/ 4字节字节 void Func(cha

16、r a100) sizeof(a) ? / 4字节而不是字节而不是100字节字节 8.3.1.5 指针与数组的对比指针与数组的对比 动态内存会自动释放 不会自动释放例:指针应该留意的特性指针消亡了,并不表示它所指的内存会被自动释放。内存被释放了,并不表示指针会消亡或者成了NULL指针。void Func(void) char *p = (char *) malloc(100); / 动态内存会自动释放吗?动态内存会自动释放吗? 8.3.1.6 指针参数是如何传送内存的指针参数是如何传送内存的*假设函数的参数是一个指针,不要指望用该指针去恳求动态内存假设函数的参数是一个指针,不要指望用该指针去恳

17、求动态内存 void GetMemory(char *p, int num) p = (char *)malloc(sizeof(char) * num); void Test(void) char *str = NULL; GetMemory(str, 100); / str 依然为依然为 NULL strcpy(str, hello);/ 运转错误运转错误 8.3.1.6 指针参数是如何传送内存的指针参数是如何传送内存的*假设函数的参数是一个指针,不要指望用该指针去恳求动态内存假设函数的参数是一个指针,不要指望用该指针去恳求动态内存 void GetMemory2(char *p, int

18、 num) *p = (char *)malloc(sizeof(char) * num); void Test(void) char *str = NULL; GetMemory(&str, 100); / str 依然为依然为 NULL strcpy(str, hello);/ 运转错误运转错误 8.3.1.6 指针参数是如何传送内存的指针参数是如何传送内存的* * * * 不要用不要用returnreturn语句前往指向语句前往指向“栈内存的指针栈内存的指针 char *GetString(void) char p = hello world; return p; / 编译器将提

19、出警告编译器将提出警告 void Test4(void) char *str = NULL; str = GetString(); / str 的内容是渣滓的内容是渣滓 printf(“%sn,str ); 8.3.1.7动态内存自动释放动态内存自动释放 free函数特点释放指针所指的内存没有销毁指针,故指针地址依然不变非NULL例: char *p = (char *) malloc(100);strcpy(p, “hello);free(p); / p 所指的内存被释放,但是所指的内存被释放,但是p所指的地址依然不变所指的地址依然不变if(p != NULL) strcpy(p, “wor

20、ld);/ 出错出错 没有起到没有起到防错作用防错作用8.3.1.8 杜绝杜绝“野指针野指针 什么是“野指针不是NULL指针是指向“渣滓内存的指针 If(p!=NULL)不能起到作用野指针的成因指针变量没有被初始化 指针初始化:char *p = NULL;char *str = (char *) malloc(100);指针p被free或者delete之后,没有置为NULL 8.3.2 编程的优化编程的优化为什么需求常量Const与#define的比较常量定义规那么循环语句的效率For语句的循环控制变量8.3.2.1 为什么用常量为什么用常量常量是一种标识符,它的值在运转期间恒定不变。用 #

21、define来定义常量称为宏常量,还可以用const来定义常量为什么要常量程序的可读性在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。假设要修正数字或字符串,那么会在很多地方改动,既费事又容易出错。尽量运用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。例如:#define MAX 100/* C言语的宏常量 */ const int MAX = 100;/ C 言语的const常量const float PI = 3.14159;/ C 言语的const常量8.3.2.2 const 与与 #define的比较的比较两种区别比较const常量有数据类型,而宏常量没有数据

22、类型。编译器可以对前者进展类型平安检查。而对后者只进展字符交换,没有类型平安检查有些集成化的调试工具可以对const常量进展调试,但是不能对宏常量进展调试。常量定义规那么需求对外公开的常量放在头文件中,不需求对外公开的常量放在定义文件的头部为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。假设某一常量与其它常量亲密相关,应在定义中包含这种关系,而不应给出一些孤立的值。例如:const float RADIUS = 100;const float DIAMETER = RADIUS * 2;8.3.2.3循环语句的效率循环语句的效率在多重循环中,假设有能够,该当将最长的循环放在最内层

23、,最短的循环放在最外层,以减少CPU跨切循环层的次数。假设循环体内存在逻辑判别,并且循环次数很大,宜将逻辑判别移到循环体的外面。for (row=0; row100; row+)for ( col=0; col5; col+ )sum = sum + arowcol;if (condition) for (i=0; iN; i+) DoSomething();else for (i=0; iN; i+) DoOtherthing();8.3.2.4 for语句的循环控制变量语句的循环控制变量循环控制变量规那么不可在for 循环体内修正循环变量,防止for 循环失去控制 建议for语句的循环控制

24、变量的取值采用“半开半闭区间写法 例子:半开半闭区间 闭区间 for (x=0; xN; x+) for (x=0; x=N; x+) ;8.3.2.5 Pragma预处置预处置其格式普通为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数。 #pragma message编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其运用方法为:#Pragma message(“音讯文本) #pragma once只需在头文件的最开场参与这条指令就可以保证头文件被编译一次,这条指令实践上在VC6中就曾经有了,但是思索到兼容性并没有太多的运用它。pragma comment(.) 该指令将一个注释记录放入一个对象文件或可执行文件中。 常用的lib关键字,可以帮我们连入一个库文件。8.3.2.5 Pragma预处置预处置#pragma pack() 对于想构造体对于想构造体Struct这样的类型,这样的类型,VC采用采用8字节对齐的方字节对齐的方式,假设我们不想运用式,假设我们不想运用8字节对齐在网络变成中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论