![[计算机软件及应用]C和C++编码规范_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac91.gif)
![[计算机软件及应用]C和C++编码规范_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac92.gif)
![[计算机软件及应用]C和C++编码规范_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac93.gif)
![[计算机软件及应用]C和C++编码规范_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac94.gif)
![[计算机软件及应用]C和C++编码规范_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-1/1/07c2ed9d-1582-45dd-b262-57a729d7dac9/07c2ed9d-1582-45dd-b262-57a729d7dac95.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.C/C+编码规则文件状态:草稿公开类型:内部公开文档编号:当前版本:V1.0作 者:制作部门:终端软件研发部完成日期:2012年07月08日;- 77 -编写与修改记录版本号完成日期更改位置更改内容编制/修改审批V1.02012.07.08全文初稿C/C+编码规则V1.0 目 录章节目录第1章前言- 7 -第2章RULECHECKER规则集- 7 -2.1基本规则集- 7 -2.1.1ansi 函数的声明和定义要遵守ANSI规定的格式- 7 -2.1.2asscal 在函数调用语句中不要使用赋值操作符- 8 -2.1.3asscon 不要在控制语句的条件表达式中使用赋值操作符- 9 -2.1
2、.4assexp 赋值表达式中的规定- 9 -2.1.5blockdecl 在语句块的头部定义变量- 10 -2.1.6boolean 使用正确格式的布尔表达式- 10 -2.1.7brkcont 程序中禁用break、continue- 11 -2.1.8classuse 对未知类成员的使用- 11 -2.1.9cmclass一个源文件只对应一个类- 12 -2.1.10cmdef 源文件中不要有类的声明- 12 -2.1.11condop 关于"? . : ." 操作符- 12 -2.1.12const 使用常量- 13 -2.1.13constrcpy 关于拷贝构造函
3、数- 14 -2.1.14constrdef 关于默认构造函数- 14 -2.1.15ctrlblock 清晰划分控制语句的语句块- 15 -2.1.16destr 关于析构函数- 15 -2.1.17dmaccess 类数据成员的访问控制- 16 -2.1.18exprcplx 表达式的复杂性- 16 -2.1.19exprparenth 在表达式中使用括号- 17 -2.1.20fntype 必须为函数返回值指定类型- 18 -2.1.21frndclass 关于友员的声明位置- 18 -2.1.22funcres 设置禁止使用的函数- 18 -2.1.23goto 禁用Goto语句- 1
4、9 -2.1.24Headercom 对文件注释的要求- 20 -2.1.25headercom 函数、类的注释- 21 -2.1.26hmclass 一个头文件中只声明一个类- 21 -2.1.27hmdef 头文件中只包含声明,不应包含实现- 21 -2.1.28hmstruct 避免重复包含头文件- 22 -2.1.29identfmt 对命名的要求- 23 -2.1.30identl 对标识符长度的要求- 23 -2.1.31identres 设置禁止使用的标识符- 24 -2.1.32imptype 明确指定类型- 24 -2.1.33incltype 设置可包含的文件- 24 -2
5、.1.34inldef 关于内联函数的声明和定义- 25 -2.1.35macrocharset 在宏中禁用某些字符- 25 -2.1.36macroparenth 括号在宏中的使用- 26 -2.1.37mconst 限制宏常量的使用- 26 -2.1.38mfunc 用内联函数代替宏函数- 27 -2.1.39mname 文件命名- 28 -2.1.40multiass 一条程序语句中只应包含一个赋值操作符- 29 -2.1.41nopreproc 限制使用编译指令- 29 -2.1.42nostruct 不要使用结构体- 30 -2.1.43notemplate 不要使用模板- 30 -
6、2.1.44nothrow 不要抛掷异常- 30 -2.1.45nounion 不要使用联合体- 30 -2.1.46operass 为类重载“=”操作符- 31 -2.1.47parammode 明确标识出函数参数的类型- 31 -2.1.48parse 分析错误- 32 -2.1.49ptraccess 指针指向的数据成员的访问方式- 32 -2.1.50ptrinit 对指针的初始化- 32 -2.1.51sectord "public", "private"和"protected" 的声明顺序- 33 -2.1.52sganc
7、str 拥有共同的基类- 35 -2.1.53sgdecl 一次只声明、定义一个变量- 35 -2.1.54sglreturn 一个函数应该只有一条return语句- 35 -2.1.55slcom 注释使用“/”- 36 -2.1.56slstat 一行只写一条语句- 36 -2.1.57swdef switch语句中的default分支- 37 -2.1.58swend 对switch语句中每个分支结尾的要求- 37 -2.1.59typeinher 明确指明派生类与基类的关系- 38 -2.1.60typeres 设置禁用的类型- 38 -2.1.61vararg 禁止函数使用可变数量的
8、参数- 39 -2.1.62varstruct 关于定义struct、union变量- 39 -2.2Scott Meyers 规则集- 40 -2.2.1assignthis 在"="操作符定义中检查是否自己赋值给自己- 40 -2.2.2cast Prefer 尽量使用C+风格的类型转换- 41 -2.2.3catchref 通过引用捕获异常- 41 -2.2.4constrinit 尽量在构造函数的初始化列表中对数据成员初始化- 42 -2.2.5convnewdel 重载new、delete操作符时应遵守的约定- 42 -2.2.6dataptr 指针数据成员- 4
9、3 -2.2.7delifnew 如果你重载了操作符"new",也应该重载操作符 "delete"- 43 -2.2.8excepspec 审慎使用异常处理- 43 -2.2.9inlinevirt 内联虚拟函数- 43 -2.2.10multinher 尽量不要使用多继承- 44 -2.2.11nonleafabs 将非末端类设计为抽象类- 44 -2.2.12normalnew 不要遮掩了"new"的正规形式- 45 -2.2.13overload 不要重载“&&”、“|”、“,”- 45 -2.2.14prepo
10、st “+”、“-”操作符前缀形式与后缀形式的区别- 45 -2.2.15refclass 类的引用- 46 -2.2.16returnthis 在重载“=”时,使其返回*this- 46 -2.2.17tryblock Try语句块- 47 -2.2.18trydestr 析构函数中的异常处理- 47 -2.2.19virtdestr 虚拟析构函数(Virtual destructor)- 47 -2.2.20assignthis(Check for Assignment to "self" in Operator "=" )- 48 -2.2.21c
11、ast(c+风格的类型转换 )- 48 -2.2.22dataptr(数据的指针类型)- 48 -2.2.23delarray (Use square brackets when deleting arrays to ensure full array is deallocated)- 49 -2.2.24exprparenth(Parenthesses should be used to indicate evaluation order)- 50 -2.2.25forinit (循环的计数器(在for循环中)必须在循环的初始化语句段中初始化)- 51 -2.2.26funcptr(不使用函
12、数指针)- 51 -2.2.27globinit (全局变量必须在定义的时候初始化)- 52 -2.2.28multinher(Multiple Inheritance Only Allowed for Inheriting Abstract )- 52 -2.2.29nonleafabs (Make non-leaf classes abstract)- 52 -2.2.30nostruct- 52 -2.2.31pmfrtn (不返回指针成员数据)- 53 -2.2.32refclass (类的引用)- 53 -2.2.33rtnlocptr (不能返回一个指向一个非静态局部变量)- 53
13、 -2.2.34vararg vararg(Variable Number of Arguments )- 53 -2.2.35varinit(参数在使用前要初始化 )- 53 -2.2.36varstruct(Struct 和 Union 变量 )- 54 -2.2.37voidptr(没有空指针)- 55 -2.3MISRA C规则集- 55 -2.3.1Operator defined.操作符定义.- 55 -2.3.2Pointer arithmetic算术指针- 56 -2.3.3Limitation of the reference complexity- 56 -2.3.4Rel
14、ational operators and pointers操作符和指针之间的连系- 56 -2.3.5Pointers to functions函数指针- 56 -2.3.6Pointers to functions.- 56 -2.3.7Address assignment.地址分配- 57 -2.3.8Null pointer.空指针- 57 -2.3.9structures 和 unions成员- 57 -2.3.10Variable storage.变量存储- 57 -2.3.11Identifiers must not exceed 31 characters.标识符不要超过31个
15、字符- 57 -2.3.12Unions access. Union访问- 58 -2.3.13Type of bitfields.位域类型- 58 -2.3.14Two bits long bit fields.位域两字节长度- 58 -2.3.15Members of structure and unions shall be named.- 58 -2.3.16Define and undef standard names.- 58 -2.3.17Standard library functions.标准库函数- 59 -2.3.18Dynamic heap memory.动态分配内存-
16、 59 -2.3.19Error indicator errno. 错误指示errno- 59 -2.3.20Name of identifiers.标识符命名- 59 -2.3.21No offsetof macro.- 60 -2.3.22No <locale.h> functions.- 60 -2.3.23No setjmp macro or longjmp function.- 60 -2.3.24No <signal.h> functions.- 60 -2.3.25No <stdio.h> functions.- 60 -2.3.26No at
17、of, atoi or atol functions.- 61 -2.3.27No abort, exit, getenv or system functions.- 61 -2.3.28No <time.h> functions.- 61 -2.3.29Type char is not allowed- 62 -2.3.30Underlying representation of floating point numbers.- 62 -2.3.31Typedef names shall not be reused.- 62 -2.3.32Numeric constants an
18、d suffixes.- 63 -2.3.33Octal constants. 八进制常量- 63 -2.3.34Declaration before use.- 64 -2.3.35Identifiers scope.- 64 -2.3.36Object declarations.- 64 -2.3.37Functions declaration.- 65 -2.3.38External definition of identifiers.- 65 -2.3.39External variables declaration.- 65 -2.3.40register storage class
19、 specifier.- 66 -2.3.41Use of tags.- 66 -2.3.42Structured initialisation.结构初始化- 66 -2.3.43Enum Initialisation数组初始化- 66 -2.3.44Side effects in condition- 67 -2.3.45Logical Operand.- 67 -2.3.46Bitwise operations shall not be performed on signed integer types.- 67 -2.3.47Shift operator and right hand o
20、perand.- 68 -2.3.48The unary minus operator shall not be applied to an unsigned expression.- 68 -2.3.49Operator sizeof.- 68 -2.3.50Operator ',' not allowed.- 69 -2.3.51Conversions.- 69 -2.3.52Redundant casts.- 69 -2.3.53Cast and pointers.- 69 -2.3.54Evaluation order of expressions.- 69 -2.3.
21、55Mixed precision arithmetic and cast.- 69 -2.3.56Test between floats.- 70 -2.3.57Inaccessible code not authorized.- 70 -2.3.58Non-null statements.- 70 -2.3.59Location of null statements.- 71 -2.3.60No Labels.- 71 -2.3.61Use of curly brackets- 71 -2.3.62Then and else parts of if statements must not
22、be void- 71 -2.3.63Default statement mandatory in a switch.- 72 -2.3.64No switch with only one case.- 72 -2.3.65Floating point variables should not be used as loop counters.- 72 -2.3.66Loop control.- 72 -2.3.67Counter in for statements- 72 -2.3.68Functions shall always be declared at file scope.- 73
23、 -2.3.69No functions with variable number of arguments.- 73 -2.3.70Trigraphs are forbidden.- 73 -2.3.71Recursion not recommended- 73 -2.3.72Function prototyping.- 74 -2.3.73Matching numbers of parameters.- 74 -2.3.74Values of void functions.- 74 -2.3.75Void expressions and function parameters.- 74 -
24、2.3.76Return in non-void functions.- 74 -2.3.77Return in void functions.- 74 -2.3.78Function with no parameters.- 75 -2.3.79Multibyte characters.- 75 -2.3.80No nested comments.- 75 -2.3.81Define and undefine in a block.- 75 -2.3.82Use of #undef.- 75 -2.3.83Functions and macros.- 75 -2.3.84Arguments
25、to function-like macros.- 76 -2.3.85Parentheses for macro occurences.- 76 -2.3.86Parentheses for macro.- 76 -2.3.87Identifiers in pre-processor directives.- 76 -2.3.88Directive pragma.- 76 -2.3.89Forbidden #include.- 77 -2.3.90Use of void type and functions.- 77 -2.3.91#include syntax.- 77 -第1章 前言本文
26、挡详细描述了在LogiscopeRulechecker中包含的所有编码规范。对每一条编码规范,分别给出了它的名称、规范的内容描述、参数(只针对可设置的规范)、遵守规范的好处以及示例。Rulechecker共包含81条编码规范,其中有30条左右可以对其内容进行定制,对于可定制编码规范的具体定制方法,可参见RuleChecker可定制规则。第2章 Rulechecker规则集Rulechecker规则集分为两大部分:基本规则集和Scott Meyers规则集。我们先来逐条介绍基本规则集中的规则。2.1 基本规则集2.1.1 ansi 函数的声明和定义要遵守ANSI规定的格式规则描述: 函数声明和定
27、义的格式,要符合ANSI规定的格式要求。它要求满足以下两项中的一项: name:为函数参数列表中的参数指定数据类型和参数名称。 void: 禁止函数参数列表为空。在RuleChecker的默认情况下,以上两项同时生效。参数: 可供选择的字符串,“name”和“void”。目的: 提高代码的可读性,改善可移植性。举例:正确写法错误写法f(int a, char *b) . f(int a, char *b); f(void);f(a, b)int a;char *b . f(int, char*);f();2.1.2 asscal 在函数调用语句中不要使用赋值操作符规则描述:
28、 函数调用语句中,在函数的参数列表中不要使用赋值操作符。赋值操作符包括=, +=, -=, *=, /=, %=, >>=, <<=, &=, |=, =,+,-。目的:避免产生不明确的赋值顺序。举例:正确写法错误写法void fun1(int a);void fun2(int b) fun1( +b );2.1.3 asscon 不要在控制语句的条件表达式中使用赋值操作符规则描述:不要在控制语句if, while, for 和 switch的条件表达式中使用赋值操作符。赋值操作符包括:=, +=, -=, *=, /=, %=, >>=, <
29、<=, &=, |=, =,+,-。目的:一个类似于 if (x=y)这样的写法是不明确、不清晰的,代码的作者也许是想写成这样: if (x=y)。举例:正确写法错误写法x -= dx;if (x) . for (i=j=n; i > 0; i-, j-) .if (x -= dx) . for (i=j=n; -i > 0; j-) .2.1.4 assexp 赋值表达式中的规定规则描述:在一个赋值表达式中: 一个左值,在表达式中应该仅被赋值一次。对于多重赋值表达式,一个左值在表达式中仅应出现一次,不能重复出现。目的:避免产生不明确的赋值顺序。举例:正确写法错误写法
30、b=c+a;a=b;a=b=c+a;2.1.5 blockdecl 在语句块的头部定义变量规则描述:变量的定义要出现在使用该变量的语句块的开头。目的:提高代码的可读性。2.1.6 boolean 使用正确格式的布尔表达式规则描述:对于if, while, for等控制语句的布尔表达式,要使用正确的格式。目的: 使代码更容易理解。举例:正确写法错误写法AlwaysTrue = true;while (AlwaysTrue = true) if (test = true) for (i=1; function_call(i) = true; i+) while (1) if (test) for
31、(i=1; function_call(i); i+) 2.1.7 brkcont 程序中禁用break、continue规则描述:在控制语句 (for, do, while) 块中,禁止使用Break和continue。不过,在switch语句块中,可以使用break。目的:和goto语句一样, 使用Break和continue会打乱代码结构化的流程。在循环语句块中禁用goto、Break和continue,会增加代码的可读性。2.1.8 classuse 对未知类成员的使用规则描述:在代码中不要使用如下形式的表达式 :u.v.a, u.v.f(),u.g().a, u.g().f(),也不
32、要有使用“->”操作符的类似形式的表达式。目的:防止类对象通过多级的“.”、“->”操作符,调用未知的成员函数、数据成员。类与类之间的接口应该清晰。举例:/不要象下面这样写代码:myWindow.itsButton.push();其中,对象myWindow的基类为类Window,itsButto是Window的一个公共数据成员,它也是一个类对象,itsButto有一个叫做push()的公共成员函数。我们应该清楚的是,类Window才是myWindow访问其的接口,myWindow 只应访问到itsButton,而不应该访问到itsButton.push()这一级,因为push()已
33、经不属于基类Window对myWindow的接口。再举一个例子:Error.pos.line;这和上面例子的道理一样,只是这一次由访问成员函数变为了访问数据成员line,这同样是不好的。2.1.9 cmclass一个源文件只对应一个类规则描述:在一个源文件中定义的每一个函数,都应该属于同一个类,即对一个类的描述要独占一个文件。其中,源文件指以*.cc, *.cxx, *.cpp, *.C or *.c为后缀的代码文件。参数:可供选择的字符串,包括*.cc, *.cxx, *.cpp, *.C or *.c,用来设置检查什么类型的代码文件。目的:提高代码的可读性。2.1.10 cmdef 源文件
34、中不要有类的声明规则描述:在一个源文件中不应该包含任何类的声明,而只应该是对类的实现,类声明应该统一放到头文件中去。其中,源文件指以*.cc, *.cxx, *.cpp, *.C or *.c为后缀的代码文件。参数:可供选择的字符串,包括*.cc, *.cxx, *.cpp, *.C or *.c,用来设置检查什么类型的代码文件。目的:提高代码的可读性。2.1.11 condop 关于"? . : ." 操作符规则描述:程序中不要使用三元运算符“? : ”。目的:提高代码的可读性。2.1.12 const 使用常量规则描述:程序中的数字和字符串,都要显示的声明、定义为常量。
35、在RuleChecker默认的情况下,只允许程序中直接出现下面这四个数字和字符串量,它们分别是:""(空字符串), " "(只包含一个空格的字符串), "0"(数字0)和 "1"(数字1)。其它任何的数字和字符串,都要定义为常量。参数:可供选择的字符串,用来指出那些允许在程序中直接出现,而不必以常量定义的数字和字符串。目的:这样做可以避免数字和字符串零散分布在代码中,使代码修改起来相当费力。遵守这项规则可以提高代码的可维护性。注意:在对某些量的初始化列表中 (比如数组、结构体),RuleChecker仅会对其前5个
36、数据成员依照该项规则进行检查。举例:正确写法错误写法#define TAB_SIZE 100enum i_val ok =7; ko =11;const char HelloWorld = "Hello World.n"char tabTAB_SIZE;i_val i;.if (i = ok) p = HelloWorld; char tab100;int i;.if (i = 7) p = "Hello World.n"2.1.13 constrcpy 关于拷贝构造函数规则描述:每一个类都应该显示的定义拷贝构造函数。参数:参数只有一个,要么为空,要么为
37、字符串"dynalloc"。如果设置参数为"dynalloc",那么RuleChecker仅在当类中包含指针类型的数据成员时,才要求类要显示定义拷贝构造函数;如果设置参数为空,则不管类中包含什么样的成员,都要显示定义拷贝构造函数。目的:确保类的编写者考虑类对象在被拷贝时可能出现的各种情况。举例:class aClass .aClass(const aClass &object); / "const" 并不是必须的.;2.1.14 constrdef 关于默认构造函数规则描述: 每一个类都应该显示的定义默认构造函数。目的:确保类
38、的编写者考虑类对象初始化时可能出现的各种情况。举例:class aClass .aClass();.;2.1.15 ctrlblock 清晰划分控制语句的语句块规则描述:控制语句(if , for , while , do.whule).的语句部分一定要用 和 括起来,以划分出清晰的语句块。目的:这样做,能够使语句的归属明确,使代码更加容易阅读和修改。举例:正确写法错误写法if (x = 0) return; else while (x > min) x-;if (x = 0) return;elsewhile (x > min)x-;2.1.16 destr 关于析构函数规则描述
39、: 每一个类都应该显示的定义析构函数。目的:确保类的编写者考虑类对象在析构时,可能出现的各种情况。举例:class aClass .aClass(aClass &object);.;2.1.17 dmaccess 类数据成员的访问控制规则描述:类对外的接口应该是完全功能化的,也就是类中可以定义Public的成员函数,但不应该有Public的数据成员。在RuleChecker默认情况下,会检查类中是否声明了Public数据成员,如果有,则视为违反了该条规则。参数:参数是public、protected、privatr这三个字符串。通过指定相应的字符串,RuleChecker就会禁止类中声
40、明与之相对应的数据成员。目的:要想改变对象的当前状态,应该通过它的成员函数来实现,而不应该通过直接设置它的数据成员。一个类的数据成员应该声明为private的,最起码也应该是protected的。2.1.18 exprcplx 表达式的复杂性规则描述:对于表达式的复杂性,要有一定的限制。表达式的复杂性通过一个叫做关联语法树(associated syntactictree)的指标来衡量,它的计算方法为:表达式中操作符的数量加上操作数的数量再加1。在RuleChecker默认情况下,表达式复杂性的上限被设定为13。参数:是一个数字,用来指定表达式复杂性的最大可接受程度。目的:提高代码的可读性。举
41、例:对于下面这个表达式:(b+c*d) + (b*f(c)*d)它包含了8个操作符,7个操作数,因此该表达式关联语法树为16。如果你设定的参数的上限小于等于16,则RuleChecker会认为此表达式违反了该条规则。2.1.19 exprparenth 在表达式中使用括号规则描述:对于一个表达式,在每一个二元、三元操作的开始和结束处,都要放置“(”和“)”。在RuleChecker中,我们可以通过放置partpar参数来减少一些限制。放置partpar参数后:当在操作符"+" 或"*"右边的操作数的右边又使用了"+" 或"*
42、"操作符时,可以不放置“(”和“)”;对赋值操作符右边的操作数,可以忽略“(”和“)”;在表达式的最外层也可以忽略“(”和“)”。除此之外的其它情况,都要放置“(”和“)”。在RuleChecker默认情况下,参数partpar被设置。参数:参数为字符串"partpar",如果放置了该参数,则RuleChecker不按照最严格的要求检测代码,而是按我们上面提到的要求来检测代码。否则,按照最严格的要求检测代码。目的:避免出现不明确的运算、赋值顺序。举例:正确写法错误写法result = (fact / 100) + rem);/当放置了partpar参数时,也可以写
43、成这样result = (fact / 100) + rem;/当放置了partpar参数时,可以用下面的写法result = (fact * ind * 100) + rem + 10 + (coeff * c);/ 代替如下的写法result = (fact * (ind * 100) + (rem + (10 + (coeff * c);result = fact / 100 + rem;2.1.20 fntype 必须为函数返回值指定类型规则描述:要为每一个函数指定它的返回值类型。如果函数没有返回值,则要定义返回类型为void。目的:改善代码的可移植性。2.1.21 frndclass
44、 关于友员的声明位置规则描述:如果将一个(或若干个)类声明为另一个类的友员,则必须将这个(这些)友员声明放在类所有数据成员声明的最前面。2.1.22 funcres 设置禁止使用的函数规则描述:禁止在程序中声明、定义、调用我们指定函数名的函数。在RuleChecker默认情况下,不禁用任何的函数名。参数:参数是一系列的字符串列表,其中的每个字符串就是在程序中要禁用的函数的名字。目的:通过禁用一些只与特定平台相关联的函数,可以提高程序的可移植性。除此之外,你还可以通过设定该规则来实现一些其它的目的,比如禁用某些极易导致程序发生错误的函数,等等。举例:如果我们设置了在程序中禁用函数fun(int
45、nCount),则在代码中出现下面的任何一种情况, RuleChecker都会认定程序违反了该条规则。Void fun (int nCount);/声明Void fun (int nCount)/定义.fun ( 1 );/调用2.1.23 goto 禁用Goto语句规则描述:程序中不要使用goto语句。在RuleChecker默认情况下,出现在程序任何地方的goto语句都是被禁止的。不过,我们可以通过设置,使得goto跳转到我们指定的语句行号的语句为合法。参数:参数是一个字符串的列表,每个字符串都代表一个语句行号,表示允许在程序中通过goto跳转到该语句行号。目的:这条规则的目的是为了确保程
46、序的结构化,因为滥用goto语句会使程序流程无规则,可读性差。Goto语句只在一种情况下有使用价值,就是当要从多重循环深处跳转到循环之外时,效率很高,但对于一般要求的软件,没有必要费劲心思追求多么高的效率,而且效率主要是取决于算法,而不在于个别的语句技巧。2.1.24 Headercom 对文件注释的要求规则描述:在头文件、实现文件的首部一定要有文件注释。在RuleChecker中,我们还可以规定这个文件注释的具体格式。在RuleChecker默认情况下,头文件和实现文件的文件注释中必须包括:文件名、开发者、开发日期、功能简介这四部分,都是以英文表示的(见下面的示例),我们也可以设置成中文。参
47、数:参数由两个字符串列表来表示:第一部分是对头文件的文件注释格式要求,第二部分是对实现文件的文件注释格式要求。每个列表都是以"HEADER" 或"CODE"开头,后面是对注释格式的具体描述。目的:提高代码的可读性。举例:下面是一个符合RuleChecker默认的对头文件文件注释格式要求的例子:/ Name: program/ Author: Andrieu/ Date: 08/07/96/ Remarks: example of comments/2.1.25 headercom 函数、类的注释规则描述:在全局、静态函数的声明、定义和类的声明、定义之前,
48、要对该函数或类加以注释。在RuleChecker中,我们还可以规定这个文件注释的格式,RuleChecker默认情况下,在函数或类之前必须有以“/”开头的注释,注释内容不限。参数:参数是五个字符串列表,这五个字符串列表分别以“class”、 "func_glob_def" 、"func_glob_decl"、"func_stat_def"、"func_stat_decl"开头,分别代表声明类、定义全局函数、声明全局函数、定义静态函数、声明静态函数,后面跟着的就是对注释格式的具体要求。目的:提高代码的可读性。2.1.
49、26 hmclass 一个头文件中只声明一个类规则描述:在一个头文件中,只应该包含对一个类的声明(嵌套类的情况除外)。RuleChecker默认情况下,头文件是指以.h、.hh、.H、.hxx、.hpp为后缀的文件。参数:参数是可供选择的字符串,比如.h、.hh、.H等,用来设置检查什么类型的代码文件。目的:提高代码的可读性。2.1.27 hmdef 头文件中只包含声明,不应包含实现规则描述:在头文件中不要定义全局变量和全局函数。在RuleChecker默认情况下,头文件指以.h、 .hh、.H、 .hxx、.hpp为后缀的代码文件。参数:参数为可供选择的字符串,包括*.h, *.hh,*.H
50、, *.hxx、*.hpp,用来设置检查什么类型的代码文件。目的:在头文件中只应该包含各种声明,而不应该包含具体的实现。2.1.28 hmstruct 避免重复包含头文件规则描述:头文件的格式应该为:#ifndef <IDENT>#define <IDENT>.#endif或者#if !defined (<IDENT>)#define <IDENT>.#endif上面的<IDENT>是一个标识字符串。RuleChecker要求在该标识字符串中必须包含相应头文件的文件名,不区分大小写。参数:参数有两个,一个用于设置标识字符串的长度,另一
51、个参数设置检查什么类型的代码文件。目的:避免对同一头文件的重复包含。举例:/ 对于文件audit.h,它的文件结构应该为:#ifndef AUDIT_H#define AUDIT_H.#endif2.1.29 identfmt 对命名的要求规则描述:在程序中声明、定义的函数、自定义数据类型、变量,在对其命名时都应该遵守一个统一的命名规范。在RuleChecker默认情况下,只规定在常量、宏中不能使用小写的英文字母。参数:参数是一系列的字符串,单数编号字符串指出了你要设定的对象,双数字符串指出了你为其设定的具体格式。目的:提高代码的可读性。2.1.30 identl 对标识符长度的要求规则描述:
52、在程序中声明、定义的函数、自定义数据类型、变量,它们的名称的长度要在设定的范围之内。RuleChecker默认情况下规定:函数名长度在4到25个字符之间,自定义数据类型名、变量名、常量名、宏名、类名长度在5到25个字符之间,其它标识符的长度在1到25个字符之间。参数:参数分三列,第一列指出了你要设定的对象,第二列、第三类指出了命名的长度范围。目的:提高代码的可读性。2.1.31 identres 设置禁止使用的标识符规则描述:某些标识符在代码中应该被禁用。比如,类库中的某些数据成员的名字。在RuleChecker默认情况下,不禁用任何标识符。参数:参数是一系列的字符串列表,其中的每个字符串就是
53、在程序中要禁用的标识符。目的:改善代码的可移植性。2.1.32 imptype 明确指定类型规则描述:要明确指定函数、函数参数、类数据成员、变量的类型。目的:改善代码的可移植性。举例:正确写法错误写法void aFunction(void);aFunction();2.1.33 incltype 设置可包含的文件规则描述:只允许在指定类型的代码文件中包含其它代码文件。在RuleChecker默认情况下,只允许头文件被包含到其它代码文件中去。参数:参数为两个字符串列表,每个列表中的第一个字符串指定了目标文件的类型,第二个字符串指出了都有那些类型的文件可以被包含到该目标文件中去。目的:改善程序代码
54、的组织结构。2.1.34 inldef 关于内联函数的声明和定义规则描述:内联函数的定义部分,要放到类的实现文件(.cpp)中去,而不要直接放在头文件中。参数:参数只有一个,字符串“private”,该参数可以用也可以不用。当放置了“private”这个字符串时,private型内联函数的定义要放到类的实现文件(.cpp)中去,其它内联函数的定义要放在头文件中;当没有放置这个字符串时,所有的内联函数的定义部分,都要放到实现文件(.cpp)中去。目的:提高代码的可读性。该规则存在的问题:放置参数“private”后并不起作用。不管是否放置了“private”字符串,该规则都会要求将所有内联函数的定义放到实现文件(.cpp)中去。2.1.35 macrocharset 在宏中禁用某些字符规则描述:可以在宏中(这里的宏只包括宏函数和宏常量这两类宏,并且检查部分只是指宏的展开部分,而不包括宏的名字)禁用某些字符。在RuleChecker默认情况下,不禁用任何字符。参数:参数为两对相互关联的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 住宅垫层施工方案
- Cu7Mn2双金属簇纤维涂层制备及其固相微萃取应用研究
- 缬氨酸通过肠道微生物及代谢物影响小鼠脂质代谢及炎症的研究
- 不同组分比例的Pt-Co-Cu合金催化剂的可控制备及催化氧化甲苯研究
- 农村三产融合发展视野下的共同富裕研究
- 基于创新意识培养的初中化学实验改进及教学研究
- 磁介导纳米纯化剂的制备及对His-tagged蛋白的特异性纯化
- 纺丝专件清洗系统设计与研究
- 财政涉农资金绩效审计评价指标体系研究-以S市为例
- 红外热成像技术在脉冲射频治疗脊神经嵌压综合征临床疗效评估中的应用
- 2024年3月ITSMS信息技术服务管理体系基础(真题卷)
- 节能评审和节能评估文件编制费用收费标准
- 2023-2024年《劳务劳动合同样本范本书电子版模板》
- 中国居民口腔健康状况第四次中国口腔健康流行病学调查报告
- MOOC 数据挖掘-国防科技大学 中国大学慕课答案
- 中药注射剂合理使用培训
- 第13课+清前中期的兴盛与危机【中职专用】《中国历史》(高教版2023基础模块)
- 2024年国家粮食和物资储备局直属事业单位招聘笔试参考题库附带答案详解
- 苏轼临江仙课件大学语文完美版
- 《施工测量》课件
- 情绪健康管理服务规范
评论
0/150
提交评论