C++/C编程规范
——帮助程序员一次性编写出高质量的程序
.
上 海 漫 索 计 算 机 科 技 有 限 公 司
目录
0. 编程老手和高手的误区
1. 程序的版式
2. 命(a < b < c)
你会编写正确的 if 语句吗
布尔变量与零值比较
整型变量与零值比较
浮点变量与零值比较
指针变量与零值比较
为什么有人用 If(NULL == P) 这样“古怪”的格式
循环语句
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。
如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。
建议for语句的循环控制变量的取值采用“半开半闭区间”写法。
switch, goto …
4. 函数设计
参数的规则
参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。
参数命名要恰当,顺序要合理。 示例 StringCopy(char *str1,char *str2)
如果参数是指针,且仅做输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。
避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。
尽量不要使用类型和数目不确定的参数。例如 printf
返回值的规则
不要省略返回值的类型。
函数名字与返回值类型在语义上不可冲突。例如 getchar
不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。
有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。例如 char *strcpy(char *strDest,const char *strSrc);
函数内部实现的规则:在函数体的“入口处”和“出口处”从严把关
在函数体的“入口处”,对参数的有效性进行检查。
在函数体的“出口处”,对return语句的正确性和效率进行检查。
4. 函数设计
一些建议
函数的功能要单一,不要设计多用途的函数。
函数体的规模要小,尽量控制在50行代码之内。
尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。
不仅要检查输入参数的有效性,还要检查通过其他途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。
用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。
使用断言
使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要做出处理的。
在函数的入口处,使用断言检查参数的有效性(合法性)。
在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
5. 内存管理
内存分配方式
从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。
常见的内存错误
内存分配未成功,却使用了它。
内存分配虽然成功,但是尚未初始化就引用它。
内存分配成功并且已经初始化,但操作越过了内存的边界。
忘记了释放内存,造成内存泄漏。
释放了内存却继续使用它
5. 内存管理
对策
用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。
动态内存的申请与释放必须配对,防止内存泄漏。
用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。
free 和 delete 把指针怎么啦?
它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。
高质量程序设计指南c c语言 来自淘豆网m.daumloan.com转载请标明出处.