欢迎来到天天文库
浏览记录
ID:38529348
大小:125.50 KB
页数:16页
时间:2019-06-14
《c 编程最佳实践》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C编程最佳实践级别:初级ShivDutta,技术顾问,IBM/GaryR.Hook,高级技术顾问,IBM2003年9月09日/2004年4月05日更新尽管C语言问世已近30年,但它的魅力仍未减退。C语言继续吸引着众多的人们,他们为了编写新的应用程序,或者移植或维护现有的应用程序而必须学习新技能。简介本文是为了满足开发人员的需要而写的。我们总结了一套指南,无论作为开发人员还是顾问,这些指南多年来一直都很好地指导着我们,我们把它们作为建议提供给您,希望对您的工作有所帮助。您也许不赞同其中的某些指南,但我们希望您会喜欢其中的一些并在您的编程或移植项目中使用它们。风格与指南·
2、使用一种使代码具有可读性和一致性的源代码风格。如果没有团队代码风格或自己的风格,您可以使用与大多数C程序员采用的Kernighan和Ritchie风格相似的风格。然而,举一个极端的例子,有可能最终会写出与下面相似的代码:inti;main(){for(;i["]
3、是intmain(void)(如果不考虑命令行参数的话)或intmain(intargc,char**argv)。ANSI以前的编译器会省略void声明,或列出变量名以及紧随其后的声明。·空格充分利用水平和垂直空格。缩进和空格间距应反映出代码的块结构。应将条件运算符的长字符串分割成单独的几行。例如:if(foo->next==NULL&&numbernext==NULL&&number4、ive(this_input)){...同样,应将描述得很详细的for循环分割成不同的行:for(curr=*varp,trail=varp;curr!=NULL;trail=&(curr->next),curr=curr->next){...对于其它复杂表达式(如使用三元运算符?:的表达式),最好也将其分割成数行。z=(x==y)?n+f(x):f(y)-n;·注释注释应描述正在发生什么事、如何完成它、参数表示什么、使用了哪些全局变量以及任何限制或错误。但要避免不必要的注释。如果代码比较清晰,并且使用了良好的变量名,那么它应该能够较好地说明自身。因为编译器不检查注释5、,所以不保证它们是正确的。与代码不一致的注释会起到相反的作用。过多的注释会使代码混乱。下面是一种多余的注释风格:i=i+1;/*Addonetoi*/很明显变量i递增了1。还有更糟的注释方法:/**************************************16*Addonetoi***************************************/i=i+1;·命名约定具有前导和尾随下划线的名称是为系统用途而保留的,不应当用于任何用户创建的名称。约定规定:1.#define常量应全部大写。2.enum常量应以大写字母开头或全部大写。3.函数、类6、型定义(typedef)和变量名以及结构(struct)、联合(union)和枚举(enum)标记名称应小写。为清晰起见,避免使用仅在大小写上有区别的名称,如foo和Foo。同样,避免使用foobar和foo_bar这样的名称。避免使用看上去相似的名称。在许多终端和打印机上,“l”、“1”和“I”看上去非常相似。使用名为“l”的变量非常不明智,因为它看上去非常象常量“1”。·变量名选择变量名时,长度不重要,但清晰的表达很重要。长名称可用于全局变量,因为它不常用,而将在每行循环上要使用的数组下标命名为i就完全够了。如果使用“index”或“elementnumber”的7、话,不仅输入得更多,而且会使计算的细节不明确。如果使用长变量名,有时候会使代码更难理解。比较:for(i=0to100)array[i]=0和for(elementnumber=0to100)array[elementnumber]=0;·函数名16函数名应反映函数执行什么操作以及返回什么内容。函数在表达式中使用,通常用于if子句,因此它们的意图应一目了然。例如:if(checksize(x))没有帮助作用,因为它没有告诉我们checksize是在出错时返回true还是在不出错时返回true;而if(validsize(x))则使函数的意图很明确。·
4、ive(this_input)){...同样,应将描述得很详细的for循环分割成不同的行:for(curr=*varp,trail=varp;curr!=NULL;trail=&(curr->next),curr=curr->next){...对于其它复杂表达式(如使用三元运算符?:的表达式),最好也将其分割成数行。z=(x==y)?n+f(x):f(y)-n;·注释注释应描述正在发生什么事、如何完成它、参数表示什么、使用了哪些全局变量以及任何限制或错误。但要避免不必要的注释。如果代码比较清晰,并且使用了良好的变量名,那么它应该能够较好地说明自身。因为编译器不检查注释
5、,所以不保证它们是正确的。与代码不一致的注释会起到相反的作用。过多的注释会使代码混乱。下面是一种多余的注释风格:i=i+1;/*Addonetoi*/很明显变量i递增了1。还有更糟的注释方法:/**************************************16*Addonetoi***************************************/i=i+1;·命名约定具有前导和尾随下划线的名称是为系统用途而保留的,不应当用于任何用户创建的名称。约定规定:1.#define常量应全部大写。2.enum常量应以大写字母开头或全部大写。3.函数、类
6、型定义(typedef)和变量名以及结构(struct)、联合(union)和枚举(enum)标记名称应小写。为清晰起见,避免使用仅在大小写上有区别的名称,如foo和Foo。同样,避免使用foobar和foo_bar这样的名称。避免使用看上去相似的名称。在许多终端和打印机上,“l”、“1”和“I”看上去非常相似。使用名为“l”的变量非常不明智,因为它看上去非常象常量“1”。·变量名选择变量名时,长度不重要,但清晰的表达很重要。长名称可用于全局变量,因为它不常用,而将在每行循环上要使用的数组下标命名为i就完全够了。如果使用“index”或“elementnumber”的
7、话,不仅输入得更多,而且会使计算的细节不明确。如果使用长变量名,有时候会使代码更难理解。比较:for(i=0to100)array[i]=0和for(elementnumber=0to100)array[elementnumber]=0;·函数名16函数名应反映函数执行什么操作以及返回什么内容。函数在表达式中使用,通常用于if子句,因此它们的意图应一目了然。例如:if(checksize(x))没有帮助作用,因为它没有告诉我们checksize是在出错时返回true还是在不出错时返回true;而if(validsize(x))则使函数的意图很明确。·
此文档下载收益归作者所有