237.C语言代码规范.docx_第1页
237.C语言代码规范.docx_第2页
237.C语言代码规范.docx_第3页
237.C语言代码规范.docx_第4页
237.C语言代码规范.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

目录一.与平台或者编译器有关的准则1二.与命名有关的准则2三.程序的版式3四.表达式和基本语句6五.函数设计8版本修改历史版本作者/修改人修改时间修改内容V 0.01庞军2011/10/19起草C语言代码规范一. 与平台或者编译器有关的准则1.1 在变量申明时,不要用非常量初始化数组。并不是所有的编译器都支持用变量初始化数组。/ 不要使用这种风格int fun(int iSize) int arrayiSize;1.2 不要使用0长度的数组。并不是所有的编译器都支持0长度的数组。1.3 不要在代码中间定义变量,在函数开始处申明变量。并不是所有的编译器都支持在代码中定义变量。1.4 不要使用匿名的 union。并不是所有的编译器都支持匿名的union。typedef struct foo int foo;union int foo_l;float foo_s; u; /* have a name here */ foo_t;1.5 不要使用uchar, u_char, ushort, u_short, uint, u_int, ulong, u_long, boolean等类型。这些类型并不是标准的C语言类型。1.6 不要把 long 类型等同于 signed 64-bit 整形,不要把 unsigned long 类型等同于 unsigned 64 bit 整形。Long类型的大小与平台有关,在32位平台上 long 是32位的。1.7 不要使用非ASCII字符写代码。1.8 不要使用 bzero(), bcopy(), bcmp()等函数,这些函数已经被标明为过时的,在以后的C库中可能不在支持以上函数。应该使用”memset()”, “memcpy()”, “memmove()”, “memcmp()”1.9 在多线程环境下,不要使用不是线程安全的函数。例如,在linux下,不要使用”ctime()”, “gmtime()”, “localtime()” 等函数,而应该使用 “ctime_r()”, “gmtime_r()”, “localtime_r()”函数线程安全的函数。1.10 不要使用 strcpy(), strcmp(), sprintf()等函数,这些函数会带来安全隐患,很多缓冲区溢出攻击都是利用这些函数的漏洞。应该使用”strncpy()”, “strncmp()”, “snprintf()”1.11 不要在栈空间中分配大量内存,应该使用动态内存。因为栈空间是有限的,但动态内存相对栈空间来说是无限的。1.12 不设计递归函数。因为递归函数容易耗尽栈空间。1.13 不要在函数中返回指向栈空间的指针。在函数返回时栈空间会被释放,指向栈空间的指针将变成非法指针。void *foo()char buf1024;return buff;1.14 将编译器的警告级别调到最高。很多BUG是由这些警告引起的。二. 与命名有关的准则2.1 标识符最好采用英文单词或其组合。标识符不能使用中文字符。2.2 标识符的长度应当符合 ”min-length & max-information” 的原则。2.3 代码中不要出现标识符完全相同的局部变量和全局变量。2.4 函数名应当使用“动词”或者“动词+名词”的组合,并且首单词小写,其他单词的首字母要大写。2.5 变量名应当使用“名词”或者“形容词+名词”的组合,并且变量要以类型的缩写开始,其他单词的首字母大写。类型说明缩写例子int整型iiValueshort短整型ssValuechar字符ccValuefloat浮点ffValuedouble双精度浮点ddValuelong长整型liValueunsigned int无符号整型uiuiValueunsigned short无符号短整型ususValueunsigned char无符号字符ucucValueunsigned long无符号长整型uiuiValueint *整型指针pipiValuechar *字符指针ppValuechar 字符数组szszValuevoid (*pfn) ()函数指针pfnpfnGetValue2.6 用正确的反义词组命名具有互斥意义的变量或相反动作的函数。int iMinValue;int iMaxValue;int getValue();void setValue(int iValue);2.7 类型名以大写字母开头的字词组合而成。struct MeterInfo;enum MeterType ;2.8 常量全用大写的字母命名,并用下划线分割单词。#define MAX_LENGTH (100)2.9 静态变量加前缀 “s_” (表示 static)。2.10 全局变量加前缀 “g_” (表示 global)。static int s_iCounter;int g_iMeterNum;三. 程序的版式3.1 将代码编辑器设置成用 4 个空格代替tab3.2 将编辑器的缩进设置成4个空格3.3 在每个函数定义结束之后都要加空行。3.4 在每个函数体内,逻辑上密切相关的语句之间不加空行,其它地方应该加空行分隔。/ 空行void Function1()/ 空行void Function2()/ 空行void Function3()/ 空行while (condition)statement1;/ 空行if (condition)statement2;elsestatement3;/ 空行statement4;3.5 一行代码只做一件事情,如只定义一个变量,或只写一条语句。3.6 if、for、while、do、等语句独占一行,执行语句不得紧跟其后。执行语句有多少都要加。风格良好的代码行风格不良好的代码行int width; / 宽度int height; / 高度int depth; / 深度int width, height, depth; / 宽度高度深度x = a + b;y = c + d;z = e + f;x = a + b; y = c + d; z = e + f;if (width height)dosomething();if (width =”、“=”、“+”、“*”、“%”、“&”、“|”、“”这类操作符前后不加空格。void func(int x, int y, int z); / 良好的风格void func (int x,int y,int z); / 不良的风格if (year = 2000) / 良好的风格if(year=2000) / 不良的风格if (a = b) & (c =b&c=d) / 不良的风格for (i = 0; i 10; i+) / 良好的风格for(i=0;i10;i+) / 不良的风格x = a b ? a : b; / 良好的风格x=aFunction(); / 不要写成 b - Function();3.13 程序的分界符和应独占一行并且位于同一列,同时与引用它们的语句左对齐。3.14 之内的代码块在右边数格处左对齐。风格良好的对齐为风格不良的对齐void Function(int x)int iMin;int iMax; / program codevoid Function(int x) / program codeif (condition) / program codeelse / program codeif (condition) / program codeelse / program codefor (initialization; condition; update) / program codewhile (condition) / program codefor (initialization; condition; update) / program codewhile (condition) / program code如果出现嵌套的,则使用缩进对齐,如: 3.15 代码行最大长度宜控制在 80 个字符以内。3.16 长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。if (very_longer_variable1 = very_longer_variable12)& (very_longer_variable3 = very_longer_variable14)& (very_longer_variable5 = very_longer_variable16)dosomething();struct CMatrix *CMultiplyMatrix(struct CMatrix *leftMatrix, struct CMatrix *rightMatrix);for (very_longer_initialization;very_longer_condition;very_longer_update)dosomething();3.17 函数申明时要用注释说明函数的功能,及函数的参数和返回值等/* 函数介绍:* 输入参数:* 输出参数: * 返回值 : */void function(float x, float y, float z)四. 表达式和基本语句4.1 如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。word = (high =-EPSINON) & (x=EPSINON)其中EPSINON 是允许的误差(即精度)。4.4 应当将指针变量用“=”或“!=”与NULL 比较。4.5 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨循环层的次数。4.6 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。低效率的循环高效率的循环for (col=0; col5; col+ )for (row=0; row100; row+)sum = sum + arowcol;for (i=0; iN; i+)if (condition)DoSomething();elseDoOtherthing();if (condition)for (i=0; iN; i+)DoSomething();elsefor (i=0; iN; i+)DoOtherthing();4.7 不可在for 循环体内修改循环变量,防止for 循环失去控制。4.8 建议for 语句的循环控制变量的取值采用“半开半闭区间”写法。4.9 每个case 语句的结尾不要忘了加break,否则将导致多个分支重叠(除非有意使多个分支重叠)。4.10 不要忘记最后那个default 分支。即使程序真的不需要default 处理,也应该保留语句 default : break; 这样做并非多此一举,而是为了防止别人误以为你忘了default 处理。4.11 不要使用 goto 语句。五. 函数设计5.1 参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。void setValue(int width, int height); / 良好的风格void setValue(int, int); / 不良的风格5.2 参数命名要恰当,顺序要合理。例如void stringCopy(char *str1, char *str2);那么我们很难搞清楚究竟是把str1 拷贝到str2 中,还是刚好倒过来。可以把参数名字起得更有意义,如叫pSource 和pDestination。这样从名字上就可以看出应该把pSource拷贝到pDestination。还有一个问题,这两个参数那一个该在前那一个该在后?参数的顺序要遵循标准 C 函数的命名习惯。一般地,应将目的参数放在前面,源参数放在后面。5.3 如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。void stringCopy(char *pDestination,const char *pSource);5.4 避免函数有太多的参数,参数个数尽量控制在5 个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。5.5 不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return 语句返回。5.6 函数的功能要单一,不要设计多用途的函数。5.7 函数体的规模要小,尽量控制在80 行代码之内。5.8 尽量将函数设计为只有一个输入和一个输出。5.

温馨提示

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

评论

0/150

提交评论