![[计算机软件及应用]C和C++编码规范.doc_第1页](http://file.renrendoc.com/FileRoot1/2019-1/15/1db27381-39a2-438a-9b7f-7eb3ac858082/1db27381-39a2-438a-9b7f-7eb3ac8580821.gif)
![[计算机软件及应用]C和C++编码规范.doc_第2页](http://file.renrendoc.com/FileRoot1/2019-1/15/1db27381-39a2-438a-9b7f-7eb3ac858082/1db27381-39a2-438a-9b7f-7eb3ac8580822.gif)
![[计算机软件及应用]C和C++编码规范.doc_第3页](http://file.renrendoc.com/FileRoot1/2019-1/15/1db27381-39a2-438a-9b7f-7eb3ac858082/1db27381-39a2-438a-9b7f-7eb3ac8580823.gif)
![[计算机软件及应用]C和C++编码规范.doc_第4页](http://file.renrendoc.com/FileRoot1/2019-1/15/1db27381-39a2-438a-9b7f-7eb3ac858082/1db27381-39a2-438a-9b7f-7eb3ac8580824.gif)
![[计算机软件及应用]C和C++编码规范.doc_第5页](http://file.renrendoc.com/FileRoot1/2019-1/15/1db27381-39a2-438a-9b7f-7eb3ac858082/1db27381-39a2-438a-9b7f-7eb3ac8580825.gif)
已阅读5页,还剩76页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C/C+编码规则编码规则 文档编号: 当前版本:V1.0 作 者: 制作部门:终端软件研发部 文件状态:草稿 公开类型:内部公开 完成日期:2012 年 07 月 08 日 I 编写与修改记录编写与修改记录 版本号版本号完成日期完成日期更改位置更改位置更改内容更改内容编制编制/修改修改审批审批 V1.02012.07.08全文初稿 - 1 - 目目 录录 章节目录章节目录 第第 1 章章前言前言- 7 - 第第 2 章章RULECHECKER 规则集规则集- 7 - 2.1基本规则集 - 7 - 2.1.1ansi 函数的声明和定义要遵守 ANSI 规定的格式- 7 - 2.1.2asscal 在函数调用语句中不要使用赋值操作符- 8 - 2.1.3asscon 不要在控制语句的条件表达式中使用赋值操作符.- 9 - 2.1.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 关于拷贝构造函数- 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 语句.- 19 - 2.1.24Headercom 对文件注释的要求.- 20 - 2.1.25headercom 函数、类的注释- 21 - 2.1.26hmclass 一个头文件中只声明一个类.- 21 - 2.1.27hmdef 头文件中只包含声明,不应包含实现 .- 21 - 2.1.28hmstruct 避免重复包含头文件- 22 - C/C+编码规则 V1.0 - 2 - 2.1.29identfmt 对命名的要求- 23 - 2.1.30identl 对标识符长度的要求.- 23 - 2.1.31identres 设置禁止使用的标识符.- 24 - 2.1.32imptype 明确指定类型.- 24 - 2.1.33incltype 设置可包含的文件.- 24 - 2.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 - 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.52sgancstr 拥有共同的基类.- 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 禁止函数使用可变数量的参数 .- 39 - 2.1.62varstruct 关于定义 struct、union 变量- 39 - 2.2SCOTT MEYERS 规则集- 40 - 2.2.1assignthis 在“=“操作符定义中检查是否自己赋值给自己 - 40 - C/C+编码规则 V1.0 - 3 - 2.2.2cast Prefer 尽量使用 C+风格的类型转换.- 41 - 2.2.3catchref 通过引用捕获异常.- 41 - 2.2.4constrinit 尽量在构造函数的初始化列表中对数据成员初始化.- 42 - 2.2.5convnewdel 重载 new、delete 操作符时应遵守的约定- 42 - 2.2.6dataptr 指针数据成员.- 43 - 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 不要重载“ f(void); f(a, b) int a; char *b . f(int, char*); f(); 2.1.2asscal 在函数调用语句中不要使用赋值操作符在函数调用语句中不要使用赋值操作符 规则描述:规则描述: 函数调用语句中,在函数的参数列表中不要使用赋值操作符。赋值操作 符包括=, +=, -=, *=, /=, %=, =, =, 0; i-, j-) . if (x -= dx) . for (i=j=n; -i 0; j-) 2.1.4assexp 赋值表达式中的规定赋值表达式中的规定 规则描述:规则描述: 在一个赋值表达式中: 一个左值,在表达式中应该仅被赋值一次。 对于多重赋值表达式,一个左值在表达式中仅应出现一次,不能重复出 现。 目的:目的: C/C+编码规则 V1.0 - 10 - 避免产生不明确的赋值顺序。 举例举例: : 正确写法错误写法 b=c+a; a=b; a=b=c+a; 2.1.5blockdecl 在语句块的头部定义变量在语句块的头部定义变量 规则描述:规则描述: 变量的定义要出现在使用该变量的语句块的开头。 目的:目的: 提高代码的可读性。 2.1.6boolean 使用正确格式的布尔表达式使用正确格式的布尔表达式 规则描述:规则描述: 对于 if, while, for 等控制语句的布尔表达式,要使用正确的格式。 目的:目的: 使代码更容易理解。 举例举例: : 正确写法错误写法 AlwaysTrue = true; while (AlwaysTrue = true) if (test = true) for (i=1; function_call(i) = while (1) if (test) for (i=1; function_call(i); i+) C/C+编码规则 V1.0 - 11 - true; i+) 2.1.7brkcont 程序中禁用程序中禁用 break、continue 规则描述规则描述: : 在控制语句 (for, do, while) 块中,禁止使用 Break 和 continue。不 过,在 switch 语句块中,可以使用 break。 目的:目的: 和 goto 语句一样, 使用 Break 和 continue 会打乱代码结构化的流程。 在循环语句块中禁用 goto、Break 和 continue,会增加代码的可读性。 2.1.8classuse 对未知类成员的使用对未知类成员的使用 规则描述规则描述: : 在代码中不要使用如下形式的表达式 :u.v.a, u.v.f(),u.g().a, u.g(). f(),也不要有使用“-”操作符的类似形式的表达式。 目的:目的: 防止类对象通过多级的“.”、“-”操作符,调用未知的成员函数、数 据成员。类与类之间的接口应该清晰。 举例举例: : /不要象下面这样写代码: myWindow.itsButton.push(); 其中,对象 myWindow 的基类为类 Window,itsButto 是 Window 的一个公 共数据成员,它也是一个类对象,itsButto 有一个叫做 push()的公共成员函 数。我们应该清楚的是,类 Window 才是 myWindow 访问其的接口,myWindow 只 应访问到 itsButton,而不应该访问到 itsButton.push()这一级,因为 push() 已经不属于基类 Window 对 myWindow 的接口。 再举一个例子: Error.pos.line; 这和上面例子的道理一样,只是这一次由访问成员函数变为了访问数据 成员 line,这同样是不好的。 C/C+编码规则 V1.0 - 12 - 2.1.9cmclass 一个源文件只对应一个类一个源文件只对应一个类 规则描述规则描述: : 在一个源文件中定义的每一个函数,都应该属于同一个类,即对一个类 的描述要独占一个文件。其中,源文件指以*.cc, *.cxx, *.cpp, *.C or *.c 为后缀的代码文件。 参数:参数: 可供选择的字符串,包括*.cc, *.cxx, *.cpp, *.C or *.c,用来设置 检查什么类型的代码文件。 目的:目的: 提高代码的可读性。 2.1.10cmdef 源文件中不要有类的声明源文件中不要有类的声明 规则描述规则描述: : 在一个源文件中不应该包含任何类的声明,而只应该是对类的实现,类 声明应该统一放到头文件中去。其中,源文件指以*.cc, *.cxx, *.cpp, *.C or *.c 为后缀的代码文件。 参数:参数: 可供选择的字符串,包括*.cc, *.cxx, *.cpp, *.C or *.c,用来设置 检查什么类型的代码文件。 目的:目的: 提高代码的可读性。 2.1.11condop 关于关于“? . : .“ 操作符操作符 规则描述规则描述: : 程序中不要使用三元运算符“? : ”。 目的:目的: 提高代码的可读性。 C/C+编码规则 V1.0 - 13 - 2.1.12const 使用常量使用常量 规则描述规则描述: : 程序中的数字和字符串,都要显示的声明、定义为常量。在 RuleChecker 默认的情况下,只允许程序中直接出现下面这四个数字和字符串 量,它们分别是:“(空字符串), “ “(只包含一个空格的字符串), “0“(数字 0)和 “1“(数字 1)。其它任何的数字和字符串,都要定义为常量。 参数:参数: 可供选择的字符串,用来指出那些允许在程序中直接出现,而不必以常 量定义的数字和字符串。 目的:目的: 这样做可以避免数字和字符串零散分布在代码中,使代码修改起来相当 费力。遵守这项规则可以提高代码的可维护性。 注意:注意: 在对某些量的初始化列表中 (比如数组、结构体),RuleChecker 仅会对 其前 5 个数据成员依照该项规则进行检查。 举例举例: : 正确写法错误写法 #define TAB_SIZE 100 enum 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“; C/C+编码规则 V1.0 - 14 - 2.1.13constrcpy 关于拷贝构造函数关于拷贝构造函数 规则描述规则描述: : 每一个类都应该显示的定义拷贝构造函数。 参数:参数: 参数只有一个,要么为空,要么为字符串“dynalloc“。如果设置参数为 “dynalloc“,那么 RuleChecker 仅在当类中包含指针类型的数据成员时,才要 求类要显示定义拷贝构造函数;如果设置参数为空,则不管类中包含什么样的 成员,都要显示定义拷贝构造函数。 目的:目的: 确保类的编写者考虑类对象在被拷贝时可能出现的各种情况。 举例举例: : class aClass . aClass(const aClass / “const“ 并不是必须的 . ; 2.1.14constrdef 关于默认构造函数关于默认构造函数 规则描述规则描述: : 每一个类都应该显示的定义默认构造函数。 目的:目的: 确保类的编写者考虑类对象初始化时可能出现的各种情况。 举例举例: : class aClass . aClass(); . C/C+编码规则 V1.0 - 15 - ; 2.1.15ctrlblock 清晰划分控制语句的语句块清晰划分控制语句的语句块 规则描述规则描述: : 控制语句(if , for , while , do.whule).的语句部分一定要用 和 括起来,以划分出清晰的语句块。 目的:目的: 这样做,能够使语句的归属明确,使代码更加容易阅读和修改。 举例举例: : 正确写法错误写法 if (x = 0) return; else while (x min) x-; if (x = 0) return; else while (x min) x-; 2.1.16destr 关于析构函数关于析构函数 规则描述规则描述: : 每一个类都应该显示的定义析构函数。 目的:目的: C/C+编码规则 V1.0 - 16 - 确保类的编写者考虑类对象在析构时,可能出现的各种情况。 举例举例: : class aClass . aClass(aClass . ; 2.1.17dmaccess 类数据成员的访问控制类数据成员的访问控制 规则描述:规则描述: 类对外的接口应该是完全功能化的,也就是类中可以定义 Public 的成员 函数,但不应该有 Public 的数据成员。 在 RuleChecker 默认情况下,会检查类中是否声明了 Public 数据成员, 如果有,则视为违反了该条规则。 参数:参数: 参数是 public、protected、privatr 这三个字符串。通过指定相应的字 符串,RuleChecker 就会禁止类中声明与之相对应的数据成员。 目的:目的: 要想改变对象的当前状态,应该通过它的成员函数来实现,而不应该通 过直接设置它的数据成员。一个类的数据成员应该声明为 private 的,最起码 也应该是 protected 的。 2.1.18exprcplx 表达式的复杂性表达式的复杂性 规则描述:规则描述: 对于表达式的复杂性,要有一定的限制。表达式的复杂性通过一个叫做 关联语法树(associated syntactictree)的指标来衡量,它的计算方法为: 表达式中操作符的数量加上操作数的数量再加 1。 在 RuleChecker 默认情况下,表达式复杂性的上限被设定为 13。 C/C+编码规则 V1.0 - 17 - 参数:参数: 是一个数字,用来指定表达式复杂性的最大可接受程度。 目的:目的: 提高代码的可读性。 举例举例: : 对于下面这个表达式: (b+c*d) + (b*f(c)*d) 它包含了 8 个操作符,7 个操作数,因此该表达式关联语法树为 16。如 果你设定的参数的上限小于等于 16,则 RuleChecker 会认为此表达式违反了该 条规则。 2.1.19exprparenth 在表达式中使用括号在表达式中使用括号 规则描述:规则描述: 对于一个表达式,在每一个二元、三元操作的开始和结束处,都要放置 “(”和“)”。 在 RuleChecker 中,我们可以通过放置 partpar 参数来减少一些限制。 放置 partpar 参数后:当在操作符“+“ 或“*“右边的操作数的右边又使用了“+“ 或“*“操作符时,可以不放置“(”和“)”;对赋值操作符右边的操作数,可 以忽略“(”和“)”;在表达式的最外层也可以忽略“(”和“)”。除此 之外的其它情况,都要放置“(”和“)”。 在 RuleChecker 默认情况下,参数 partpar 被设置。 参数:参数: 参数为字符串“partpar“,如果放置了该参数,则 RuleChecker 不按照最 严格的要求检测代码,而是按我们上面提到的要求来检测代码。否则,按照最 严格的要求检测代码。 目的:目的: 避免出现不明确的运算、赋值顺序。 举例举例: : C/C+编码规则 V1.0 - 18 - 正确写法错误写法 result = (fact / 100) + rem); /当放置了 partpar 参数时,也可以写成这样 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.20fntype 必须为函数返回值指定类型必须为函数返回值指定类型 规则描述:规则描述: 要为每一个函数指定它的返回值类型。如果函数没有返回值,则要定义 返回类型为 void。 目的:目的: 改善代码的可移植性。 2.1.21frndclass 关于友员的声明位置关于友员的声明位置 规则描述:规则描述: 如果将一个(或若干个)类声明为另一个类的友员,则必须将这个(这 些)友员声明放在类所有数据成员声明的最前面。 2.1.22funcres 设置禁止使用的函数设置禁止使用的函数 规则描述:规则描述: C/C+编码规则 V1.0 - 19 - 禁止在程序中声明、定义、调用我们指定函数名的函数。在 RuleChecker 默认情况下,不禁用任何的函数名。 参数:参数: 参数是一系列的字符串列表,其中的每个字符串就是在程序中要禁用的 函数的名字。 目的:目的: 通过禁用一些只与特定平台相关联的函数,可以提高程序的可移植性。 除此之外,你还可以通过设定该规则来实现一些其它的目的,比如禁用某些极 易导致程序发生错误的函数,等等。 举例举例: : 如果我们设置了在程序中禁用函数 fun(int nCount),则在代码中出现 下面的任何一种情况, RuleChecker 都会认定程序违反了该条规则。 Void fun (int nCount);/声明 Void fun (int nCount)/定义 . fun ( 1 );/调用 2.1.23goto 禁用禁用 Goto 语句语句 规则描述:规则描述: 程序中不要使用 goto 语句。在 RuleChecker 默认情况下,出现在程序任 何地方的 goto 语句都是被禁止的。不过,我们可以通过设置,使得 goto 跳转 到我们指定的语句行号的语句为合法。 参数:参数: 参数是一个字符串的列表,每个字符串都代表一个语句行号,表示允许 在程序中通过 goto 跳转到该语句行号。 目的:目的: C/C+编码规则 V1.0 - 20 - 这条规则的目的是为了确保程序的结构化,因为滥用 goto 语句会使程序 流程无规则,可读性差。 Goto 语句只在一种情况下有使用价值,就是当要从多重循环深处跳转到 循环之外时,效率很高,但对于一般要求的软件,没有必要费劲心思追求多么 高的效率,而且效率主要是取决于算法,而不在于个别的语句技巧。 2.1.24Headercom 对文件注释的要求对文件注释的要求 规则描述:规则描述: 在头文件、实现文件的首部一定要有文件注释。 在 RuleChecker 中,我们还可以规定这个文件注释的具体格式。 在 RuleChecker 默认情况下,头文件和实现文件的文件注释中必须包括: 文件名、开发者、开发日期、功能简介这四部分,都是以英文表示的(见下面 的示例),我们也可以设置成中文。 参数:参数: 参数由两个字符串列表来表示:第一部分是对头文件的文件注释格式要 求,第二部分是对实现文件的文件注释格式要求。每个列表都是以“HEADER“ 或 “CODE“开头,后面是对注释格式的具体描述。 目的:目的: 提高代码的可读性。 举例举例: : 下面是一个符合 RuleChecker 默认的对头文件文件注释格式要求的例子: / / Name: program / Author: Andrieu / Date: 08/07/96 / Remarks: example of comments / C/C+编码规则 V1.0 - 21 - 2.1.25headercom 函数、类的注释函数、类的注释 规则描述:规则描述: 在全局、静态函数的声明、定义和类的声明、定义之前,要对该函数或 类加以注释。 在 RuleChecker 中,我们还可以规定这个文件注释的格式, RuleChecker 默认情况下,在函数或类之前必须有以“/”开头的注释, 注释内容不限。 参数:参数: 参数是五个字符串列表,这五个字符串列表分别以“class”、 “func_glob_def“ 、“func_glob_decl“、“func_stat_def“、“func_stat_decl“ 开头,分别代表声明类、定义全局函数、声明全局函数、定义静态函数、声明 静态函数,后面跟着的就是对注释格式的具体要求。 目的:目的: 提高代码的可读性。 2.1.26hmclass 一个头文件中只声明一个类一个头文件中只声明一个类 规则描述:规则描述: 在一个头文件中,只应该包含对一个类的声明(嵌套类的情况除外)。 RuleChecker 默认情况下,头文件是指以.h、.hh、.H、.hxx、.hpp 为后缀的文 件。 参数:参数: 参数是可供选择的字符串,比如.h、.hh、.H 等,用来设置检查什么类 型的代码文件。 目的:目的: 提高代码的可读性。 2.1.27hmdef 头文件中只包含声明,不应包含实现头文件中只包含声明,不应包含实现 规则描述:规则描述: C/C+编码规则 V1.0 - 22 - 在头文件中不要定义全局变量和全局函数。 在 RuleChecker 默认情况下,头文件指以.h、 .hh、.H、 .hxx、.hpp 为后缀的代码文件。 参数:参数: 参数为可供选择的字符串,包括*.h, *.hh,*.H, *.hxx、*.hpp,用来设 置检查什么类型的代码文件。 目的:目的: 在头文件中只应该包含各种声明,而不应该包含具体的实现。 2.1.28hmstruct 避免重复包含头文件避免重复包含头文件 规则描述:规则描述: 头文件的格式应该为: #ifndef #define . #endif 或者 #if !defined () #define . #endif 上面的是一个标识字符串。RuleChecker 要求在该标识字符串中 必须包含相应头文件的文件名,不区分大小写。 参数:参数: 参数有两个,一个用于设置标识字符串的长度,另一个参数设置检查什 么类型的代码文件。 目的:目的: C/C+编码规则 V1.0 - 23 - 避免对同一头文件的重复包含。 举例举例: : / 对于文件 audit.h,它的文件结构应该为: #ifndef AUDIT_H #define AUDIT_H . #endif 2.1.29identfmt 对命名的要求对命名的要求 规则描述:规则描述: 在程序中声明、定义的函数、自定义数据类型、变量,在对其命名时都 应该遵守一个统一的命名规范。 在 RuleChecker 默认情况下,只规定在常量、宏中不能使用小写的英文 字母。 参数:参数: 参数是一系列的字符串,单数编号字符串指出了你要设定的对象,双数 字符串指出了你为其设定的具体格式。 目的:目的: 提高代码的可读性。 2.1.30identl 对标识符长度的要求对标识符长度的要求 规则描述:规则描述: 在程序中声明、定义的函数、自定义数据类型、变量,它们的名称的长 度要在设定的范围之内。 RuleChecker 默认情况下规定:函数名长度在 4 到 25 个字符之间,自定 义数据类型名、变量名、常量名、宏名、类名长度在 5 到 25 个字符之间,其它 标识符的长度在 1 到 25 个字符之间。 参数:参数: C/C+编码规则 V1.0 - 24 - 参数分三列,第一列指出了你要设定的对象,第二列、第三类指出了命 名的长度范围。 目的:目的: 提高代码的可读性。 2.1.31identres 设置禁止使用的标识符设置禁止使用的标识符 规则描述:规则描述: 某些标识符在代码中应该被禁用。比如,类库中的某些数据成员的名字。 在 RuleChecker 默认情况下,不禁用任何标识符。 参数:参数: 参数是一系列的字符串列表,其中的每个字符串就是在程序中要禁用的 标识符。 目的:目的: 改善代码的可移植性。 2.1.32imptype 明确指定类型明确指定类型 规则描述:规则描述: 要明确指定函数、函数参数、类数据成员、变量的类型。 目的:目的: 改善代码的可移植性。 举例举例: : 正确写法错误写法 void aFunction(void);aFunction(); 2.1.33incltype 设置可包含的文件设置可包含的文件 规则描述:规则描述: C/C+编码规则 V1.0 - 25 - 只允许在指定类型的代码文件中包含其它代码文件。 在 RuleChecker 默认情况下,只允许头文件被包含到其它代码文件中去。 参数:参数: 参数为两个字符串列表,每个列表中的第一个字符串指定了目标文件的 类型,第二个字符串指出了都有那些类型的文件可以被包含到该目标文件中去。 目的:目的: 改善程序代码的组织结构。 2.1.34inldef 关于内联函数的声明和定义关于内联函数的声明和定义 规则描述:规则描述: 内联函数的定义部分,要放到类的实现文件(.cpp)中去,而不要直接 放在头文件中。 参数:参数: 参数只有一个,字符串“private”,该参数可以用也可以不用。 当放置了“private”这个字符串时,private 型内联函数的定义要放到 类的实现文件(.cpp)中去,其它内联函数的定义要放在头文件中;当没有放 置这个字符串时,所有的内联函数的定义部分,都要放到实现文件(.cpp)中 去。 目的:目的: 提高代码的可读性。 该规则存在的问题: 放置参数“private”后并不起作用。不管是否放置了“private”字符 串,该规则都会要求将所有内联函数的定义放到实现文件(.cpp)中去。 2.1.35macrocharset 在宏中禁用某些字符在宏中禁用某些字符 规则描述:规则描述: C/C+编码规则 V1.0 - 26 - 可以在宏中(这里的宏只包括宏函数和宏常量这两类宏,并且检查部分 只是指宏的展开部分,而不包括宏的名字)禁用某些字符。 在 RuleChecker 默认情况下,不禁用任何字符。 参数:参数: 参数为两对相互关联的字符串。第一对字符串是针对宏常量的,第二对 字符串是针对宏函数的。要禁用哪些字符,就把这些字符添加到字符串中去。 目的:目的: 改善代码的可移植性。 2.1.36macroparenth 括号在宏中的使用括号在宏中的使用 规则描述:规则描述: 对于宏的展开部分,在宏的参数出现的地方要加括号“()”。 目的:目的: 保证宏替换的安全,同时提高代码的可读性。 举例举例: : 正确写法错误写法 #define GET_NAME(obj,ind) (obj)-nameind#define GET_NAME(obj,ind) obj-nameind 2.1.37mconst 限制宏常量的使用限制宏常量的使用 规则描述:规则描述: 宏常量的使用要受到限制。 在 RuleChecker 中,有三个可选的设置: varvar:当设定该参数时,字符串不能用宏常量来表示,其它的数值不受 限制。 举例举例: : C/C+编码规则 V1.0 - 27 - 正确写法错误写法 const char *string = “Hello world!n“; #define value 3 #define string “Hello world!n“ constconst:当设定该参数时,一律要求使用 const 来定义数值常量,禁止 使用通过宏来替代数值的方法。 举例: 正确写法错误写法 const char *string = “Hello world!n“; const int value = 3; #define string “Hello world!n“ #define value 3 nodefinenodefine:当设定该参数时,程序中只允许使用宏函数和预编译指令。 其它任何的宏均禁止使用。 举例举例: : 正确写法错误写法 #define VERBOSE #define min(x,y) (x)=, fld 的形式代替(*ptr).fld 的形式。 2.1.50ptrinit 对指针的初始化对指针的初始化 规则描述:规则描述: 在定义指针变量的同时,就要对其进行初始化。 目的:目的: 保证指针变量在被使用前已经被初始化。 举例举例: : 正确格式错误格式 int* y= . int *y ; *y= . 2.1.51sectord “public“, “private“和和“protected“ 的声明顺序的声明顺序 规则描述:规则描述: 在类声明中,要将处于不同访问控制级别的类成员,按照指定的顺序声 明。 参数:参数: C/C+编码规则 V1.0 - 34 - 参数为一个字符串列表,其中可以包括: “、“private“、“protected“、“public“这四个字符串。 “private“、“protected“、“public“三个字符串分别代表 private、protected、public 访问控制级别的类成员,空字符串“表示未明确 指出访问控制级别的类成员(未明确指出的访问控制级别被默认为 private)。 在列表中出现的字符串,表示允许在类声明中出现的访问控制级别,列 表中字符串的顺序,表示对声明不同访问控制级别的类成员的声明顺序要求。 RuleChecker 默认情况下该参数为空。 目的:目的: 提高代码的可读性。 举例:举例: / 如果我们这样设置了参数:“ “private“ “protected“ “public“,则表示我们允许在类 /中声明 private、protected、public 访问控制级别的成员,且声明的顺序依次是:默认/ 访问控制级别成员、private 成员、protected 成员、public 成员。对于声明的顺序,并不/ 要求必须完整包括这四部分,声明顺序可以只是:protected 成员、public 成员,或者是 /private 成员、public 成员,等等。 正确写法错误写法 class aClass /顺序为:“、 “private“ 、“protected“、 “public“。 int i ; private: void p1(); protected: void p2(); public: class aClass /颠倒了“private“和 “protected“的顺序,不符合要求。 protected: .; private: . ; ; C/C+编码规则 V1.0 - 35 - void p3(); ; class aClass /顺序为:“protected“ int i ; protected: void p(); ; class aClass /顺序为: “protected“ “public“ protected: int i ; public: void p(); ; 2.1.52sgancstr 拥有共同的基类拥有共同的基类 规则描述:规则描述: 在整个系统中,应该有一个类作为所有其它类的直接或间接父类。 参数:参数: 参数为一个字符串,来指定这个超级基类的名字。 C/C+编码规则 V1.0 - 36 - 2.1.53sgdecl 一次只声明、定义一个变量一次只声明、定义一个变量 规则描述:规则描述: 一次(一条声明、定义语句)只声明、定义一个变量。 目的:目的: 提高代码的可读性。 举例:举例: 正确写法错误写法 int width; int length; int width, length; 2.1.54sglreturn 一个函数应该只有一条一个函数应该只有一条 return 语句语句 规则描述:规则描述: 一个函数中应该只有一条 return 语句。 目的:目的: 增加函数的可靠性;使代码更容易理解。 疑义:疑义: RuleChecker 在对这条规则的实现上不太完善,它只是机械的检查“return”的个数。 比如对于如下的代码: void CMyClass:Fun1( int* a) if( a 10 ) return; a+; C/C+编码规则 V1.0 - 37 - 实际是有两个出口,但 RuleChecker 却认为其合格。 2.1.55slcom 注释使用注释使用“/” 规则描述:规则描述: 对代码的注释一律使用“/”,禁止使用“/*.*/”。 目的:目的: 提高代码的可读性。 2.1.56slstat 一行只写一条语句一行只写一条语句 规则描述:规则描述: 一行只写一条程序语句。 目的:目的: 提高代码的可读性。 举例:举例: 正确写法错误写法 x = x0; y = y0; while (IsOk(x) x+; x = x0; y = y0; while (IsOk(x) x+; while (IsOk(x) x+; 2.1.57swdef switch 语句中的语句中的 default 分支分支 规则描述:规则描述: 在 switch 语句块中,一定要有default 分支来处理其它的情况。 C/C+编码规则 V1.0 - 38 - 参数:参数: 参数只有一个,要么为空,要么为字符串“last“。如果设置参数为 “last“,则要求 default 分支出现在 switch 语句块的最后。如果不设置这个参 数,则 switch 语句块中只要有 default 分支即可。 RuleChecker 默认情况下参数被设置为“last“。 目的:目的: 用来处理 switch 语句中默认、特殊的情况。 2.1.58swend 对对 switch 语句中每个分支结尾的要求语句中每个分支结尾的要求 规则描述:规则描述: switch 语句中的每一个 case 分支,都要以 break、continue、goto、return、exit 中之一作为分支的结尾(几个连续的 空 case 语句允许共用一个)。 参数:参数: 参数只有一个,要么为空,要么为字符串“nolast“。如果设置参数为 “nolast“,则对最后一个分支不做要求。如果不设置“nolast“,则对最后一个 分支做同样的要求。 RuleChecker 默认情况下参数被设置为“nolast“。 目的:目的: 使代码更容易理解;减少代码发生错误的可能性。 2.1.59typeinher 明确指明派生类与基类的关系明确指明派生类与基类的关系 规则描述:规则描述: 在由基类派生子类时,要明确指明派生类对基类的访问控制(public, protected, private)。 目的:目的: 明确子类、基类的继承关系。 举例:举例: C/C+编码规则 V1.0 - 39 - 正确写法错误写法 class inherclass : public Base1, private Base2 . class inherclass2 : private Base1 . class inherclass1 : public Base1, Base2 /等价于 public Base1, private Base2 . class inherclass2 : Base1 /等价于 private Base1 . 2.1.60typeres 设置禁用的类型设置禁用的类型 规则描述:规则描述: 我们可以禁止在程序中声明、定义某些类型的变量,禁止在程序中声明、 定义某些返回类型的函数。 在 RuleChecker 默认情况下,不禁用任何类型。 注意:注意: 当你用 typedef 为某一类型重新定义了一个名字时,则 RuleChecker 不 再能够正确的识别出该类型。 参数:参数: 参数是两个分别以“data”和“function”开头的字符串列表。以 “data”开头的字符串列表表示禁止在程序中声明、定义哪些类型的变量,以 “function”开头的字符串列表表示禁止在程序中声明、定义哪些返回类型的 函数。 目的;目的; 提高程序的可移植性。 2.1.61vararg 禁止函数使用可变数量的参数禁止函数使用可变数量的参数 规则描述:规则描述: C/C+编码规则 V1.0 - 40 - 定义、声明一个函数时,在其参数列表中禁止使用“”。 在参数列表中使用“”的一个例子:C 函数 printf(const char *, .) 目的:目的: 使代码更容易理解。 2.1.62varstruct 关于定义关于定义 struct、union 变量变量 规规则描述则描述: 禁止在程序中直接定义结构体(struct)、联合体(union)变量。 要使用 typedef 为自定义的结构体、联合体重新命名后,再使用这个名 字来定义变量。 目的:目的: 使代码更容易理解。 举例:举例: 正确写法错误写法 typedef struct . typeName; typeName varName; struct . varName; 2.2Scott Meyers 规则集规则集 下面的 19 条编码规则取自 Scott Meyers 写的两本书:Effective C+、More Effective C+,所以我们称它们为 Scott Meyers 编码规则。象前面的基本规则一样, 我们逐条来介绍每一条规则。 C/C+编码规则 V1.0 - 41 - 2.2.1assignthis 在在“=“操作符定义中检查是否自己赋值给操作符定义中检查是否自己赋值给 自己自己 规则描述:规则描述: 在类的赋值操作符的定义中,RuleChecker 会检查: - 程序是否对参数和 this(或 *this)之间进行了“=”判断; - 如果进行了这个判断,是否返回了*this; 目的:目的: 确保在类的赋值操作符的定义中,避免发生自己赋值给自己的这种情况。 举例:举例: 正确写法错误写法 class CTest public: int m_1; CTest ; CTest m_1 = obj1.m_1; return *this; class CTest public: int m_1; CTest ; CTest C/C+编码规则 V1.0 - 42 - 该规则目前存在的问题:该规则目前存在的问题: 在 RuleChecker 中,该规则不能正确发挥作用。象上面那种存在缺陷的 情况,RuleChecker 并不能检测出来。 2.2.2cast Prefer 尽量使用尽量使用 C+风格的类型转换风格的类型转换 该规则参考自More Effective C+中的条款 2。 规则描述:规则描述: 用 C+提供的类型转换操作符(static_cast,const_cast, dynamic_cast 和 reinterpret_cast)代替 C 风格的类型转换符。 目的:目的: C 风格的类型转换符有两个缺
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年药事服务行业当前发展趋势与投资机遇洞察报告
- 2025年食品安全大数据行业当前发展趋势与投资机遇洞察报告
- 支行消防知识培训总结课件
- 2025年初级卫生专业技术资格必考题含答案
- 【2025年】江苏省淮安市会计从业资格会计基础预测试题含答案
- 偏重矿山安全试题(附答案)
- 2025年初级社工证考试-社会工作实务试题及答案
- 2025年餐饮服务从业人员食品安全知识培训考试题及答案
- 2025年社会工作者初级实务考试试题及答案解析
- (2025年)湖北省鄂州市中级会计职称经济法预测试题含答案
- 中国移动家集客考试题库(浓缩700题)
- 《新媒体写作与传播(第2版)》教学大纲、课程标准、习题答案
- 医疗器械产品生命周期管理-洞察分析
- T∕CFA 0308052-2019 铸造绿色工艺规划要求和评估 导则
- 中国古代文学史明代文学
- 《薄冰英语语法详解》
- 律师事务所数据安全应急预案
- 生涯规划讲座模板
- 男生形体课课件
- 餐厅转包合同范本
- 食堂培训计划及培训内容
评论
0/150
提交评论