语言独立问题 |
---|
非必要结构 |
---|
Rule 0-1-1 | 项目不得包含不可达代码 | 要求 | 是 |
Rule 0-1-2 | 项目不得包含不可行路径 | 要求 | 是 |
Rule 0-1-3 | 项目不得包含未使用的变量 | 要求 | 是 |
Rule 0-1-4 | 项目不得包含只使用一次的非易失性(non-volatile)POD变量 | 要求 | 是 |
Rule 0-1-5 | 项目不得包含未使用的类型声明 | 要求 | 是 |
Rule 0-1-6 | 项目不得含有“非易失性变量被赋值,随后始终未使用该值”的实例 | 要求 | 是 |
Rule 0-1-7 | 不是重载运算符的函数,若其返回类型为非 void,则必须使用其返回值 | 要求 | 是 |
Rule 0-1-8 | 具有 void 返回类型的函数必须有外部副作用 | 要求 | 是 |
Rule 0-1-9 | 不得存在死代码 | 要求 | 是 |
Rule 0-1-10 | 每个被定义的函数必须至少被调用一次 | 要求 | 是 |
Rule 0-1-11 | 非虚(non-virtual)函数中不得存在未使用的形参(无论命名或未命名) | 要求 | 是 |
Rule 0-1-12 | 在一个虚拟函数和所有覆盖了它的函数的形参集中,不得有未使用的(命名或未命名)形参 | 要求 | 是 |
存储 |
---|
Rule 0-2-1 | 不得将对象分配给与其重叠的对象 | 要求 | 是 |
运行时失败 |
---|
Rule 0-3-1 | 必须通过使用以下至少一种方法来确保尽量减少运行时失败(run-time failure):(a)静态分析工具/技术;(b)动态工具/技术;(c)处理运行时失败的显式代码 | 强制 | 否 |
Rule 0-3-2 | 如果函数返回了错误信息,那么必须测试该错误信息 | 要求 | 是 |
算术 |
---|
Rule 0-4-1 | 缩放整型(scaled-integer)算术或定点算术的使用必须有文档记录 | 强制 | 否 |
Rule 0-4-2 | 浮点算术的使用必须有文档记录 | 强制 | 否 |
Rule 0-4-3 | 浮点实现必须符合定义的浮点标准 | 强制 | 否 |
一般规则 |
---|
语言 |
---|
Rule 1-0-1 | 所有代码必须遵循 ISO/IEC 14882:2003 C++标准(包含技术勘误1) | 要求 | 是 |
Rule 1-0-2 | 只有在使用同一个已定义的接口时才能使用多个编译器 | 强制 | 否 |
Rule 1-0-3 | 在选定的编译器中进行整型除法时,必须确定并记录它的实现 | 强制 | 否 |
词法约定 |
---|
字符集 |
---|
Rule 2-2-1 | 字符集及对应的编码必须有文档记录 | 强制 | 否 |
三字符组 |
---|
Rule 2-3-1 | 不得使用三字符组 | 要求 | 是 |
替代标记 |
---|
Rule 2-5-1 | 不应使用双字符组(digraph) | 建议 | 是 |
注释 |
---|
Rule 2-7-1 | 不得在C语言风格的注释内部使用字符序列 /* | 要求 | 是 |
Rule 2-7-2 | 不得使用C语言风格的注释将代码段“注释掉” | 要求 | 是 |
Rule 2-7-3 | 不应使用C++注释将代码段“注释掉” | 建议 | 否 |
标识符 |
---|
Rule 2-10-1 | 必须确保标识符使用不易混淆的排版 | 要求 | 是 |
Rule 2-10-2 | 在内部作用域中声明的标识符不得隐藏在外部作用域中声明的标识符 | 要求 | 是 |
Rule 2-10-3 | 类型定义(typedef)名称(如有修饰,那么也包括修饰)必须是唯一标识符 | 要求 | 是 |
Rule 2-10-4 | 类、联合体或枚举的名称(如有修饰,那么也包括修饰)必须是唯一标识符 | 要求 | 是 |
Rule 2-10-5 | 具有静态存储周期的非成员对象或函数的标识符名称不应重复使用 | 建议 | 否 |
Rule 2-10-6 | 如果某标识符已经指代了一个类型,那么在同一作用域内,它不得用于指代一个对象或函数 | 要求 | 是 |
字面量 |
---|
Rule 2-13-1 | 只能使用ISO/IEC 14882:2003中定义的转义序列 | 要求 | 是 |
Rule 2-13-2 | 不得使用八进制常量(零除外)和八进制转义序列(“\0”除外) | 要求 | 是 |
Rule 2-13-3 | 必须对所有八进制或十六进制的无符号整型字面量使用后缀“U” | 要求 | 是 |
Rule 2-13-4 | 字面量后缀必须是大写字母 | 要求 | 是 |
Rule 2-13-5 | 不得将宽字符串字面量和窄字符串字面量串接 | 要求 | 是 |
基本概念 |
---|
声明和定义 |
---|
Rule 3-1-1 | 在不违反“单一定义规则”的情况下,可以在多个翻译单元中包含任何头文件 | 要求 | 是 |
Rule 3-1-2 | 不得在块作用域内声明函数 | 要求 | 是 |
Rule 3-1-3 | 声明一个数组时,必须显式说明其大小,或通过初始化隐式定义其大小 | 要求 | 是 |
单一定义规则 |
---|
Rule 3-2-1 | 一个对象或函数的所有声明的类型必须兼容 | 要求 | 是 |
Rule 3-2-2 | 不得违反单一定义规则 | 要求 | 是 |
Rule 3-2-3 | 在多个翻译单元中使用的类型、对象或函数必须在且仅在文件中声明 | 要求 | 是 |
Rule 3-2-4 | 一个具有外部链接的标识符必须有且仅有一个定义 | 要求 | 是 |
声明区域和范围 |
---|
Rule 3-3-1 | 具有外部链接的对象或函数必须在一个头文件中声明 | 要求 | 是 |
Rule 3-3-2 | 如果一个函数有内部链接,那么所有的重新声明都必须包括静态(static)存储类说明符 | 要求 | 是 |
查找名称 |
---|
Rule 3-4-1 | 声明为对象或类型的标识符必须在一个使其可见性最低的代码块中定义 | 要求 | 是 |
类型 |
---|
Rule 3-9-1 | 在所有声明和重新声明中,用于对象、函数返回类型或函数参数的类型的每个词符必须对应相同 | 要求 | 是 |
Rule 3-9-2 | 应使用指示大小和符号性的类型定义(typedef)代替基本数据类型 | 建议 | 否 |
Rule 3-9-3 | 不得使用浮点值的底层位表示(underlying bit representations) | 要求 | 是 |
标准转换 |
---|
整型提升 |
---|
Rule 4-5-1 | 不得将具有bool类型的表达式用作内置运算符的操作数,以下运算符除外:赋值运算符=、逻辑运算符&&、||和!、相等运算符==和!=、一元运算符&以及条件运算符 | 要求 | 是 |
Rule 4-5-2 | 不得将具有枚举类型的表达式用作内置运算符的操作数,以下运算符除外:下标运算符[ ]、赋值运算符=、相等运算符==和!=、一元运算符&以及关系运算符<、<=、>和>= | 要求 | 是 |
Rule 4-5-3 | 不得将具有(普通)char和wchar_t类型的表达式用作内置运算符的操作数,以下运算符除外:赋值运算符=、相等运算符==和!=以及一元运算符& | 要求 | 是 |
指针转换 |
---|
Rule 4-10-1 | NULL不得用作整型值 | 要求 | 是 |
Rule 4-10-2 | 字面量零(0)不得用作空指针常量 | 要求 | 是 |
表达式 |
---|
一般规则 |
---|
Rule 5-0-1 | 无论采取何种求值顺序(只要标准允许采用该顺序),表达式的值不得发生改变 | 要求 | 是 |
Rule 5-0-2 | 在表达式中,应有限制地依赖 C++ 运算符优先级规则 | 建议 | 否 |
Rule 5-0-3 | 不得将c值表达式隐式转换为其他底层类型 | 要求 | 是 |
Rule 5-0-4 | 隐式整型转换不得改变底层类型的符号性 | 要求 | 是 |
Rule 5-0-5 | 不得存在隐式的浮点-整型转换 | 要求 | 是 |
Rule 5-0-6 | 隐式的整型或浮点转换不得使底层类型变小 | 要求 | 是 |
Rule 5-0-7 | c值表达式不得存在显式的浮点-整型转换 | 要求 | 是 |
Rule 5-0-8 | 显式的整型或浮点转换不得使c值表达式的底层类型变大 | 要求 | 是 |
Rule 5-0-9 | 显式的整型转换不得改变c值表达式的底层类型的符号性 | 要求 | 是 |
Rule 5-0-10 | 如果对底层类型为无符号char或无符号short的操作数应用按位操作符~和<<,其结果必须立即转换为该操作数的底层类型 | 要求 | 是 |
Rule 5-0-11 | 普通的char类型只得用于存储和使用字符值 | 要求 | 是 |
Rule 5-0-12 | 有符号char和无符号char类型只得用于存储和使用数字值 | 要求 | 是 |
Rule 5-0-13 | if语句的条件和迭代语句的条件都必须具有bool类型 | 要求 | 是 |
Rule 5-0-14 | 条件运算符的第一个操作数必须为bool类型 | 要求 | 是 |
Rule 5-0-15 | 指针算术只能以数组索引的形式进行 | 要求 | 是 |
Rule 5-0-16 | 指针操作数,以及任何使用该操作数经过指针算术得到的指针,必须对同一数组的元素寻址 | 要求 | 是 |
Rule 5-0-17 | 指针相减只能用来对同一数组的指针寻址 | 要求 | 是 |
Rule 5-0-18 | >、>=、<、<=不得应用于类型为指针的对象,除非它们指向同一数组 | 要求 | 是 |
Rule 5-0-19 | 对象的声明不得包含超过两级的指针间接 | 要求 | 是 |
Rule 5-0-20 | 二元按位运算符的非常量操作数必须具有相同的底层类型 | 要求 | 是 |
Rule 5-0-21 | 按位运算符只得用于无符号底层类型的操作数 | 要求 | 是 |
后缀表达式 |
---|
Rule 5-2-1 | 逻辑运算符&&或||的每个操作数都必须是后缀表达式 | 要求 | 是 |
Rule 5-2-2 | 指向虚基类(virtual base class)的指针只能通过dynamic_cast的方式被转换为指向派生类(derived class)的指针 | 要求 | 是 |
Rule 5-2-3 | 不应对多态类型(polymorphic types)进行从基类到派生类的转换 | 建议 | 否 |
Rule 5-2-4 | 不得使用C风格的cast转换(除了void转换)和函数式记法转换(除了显式构造函数调用) | 要求 | 是 |
Rule 5-2-5 | 不得使用cast移除指针类型或引用类型的任何const或volatile修饰 | 要求 | 是 |
Rule 5-2-6 | 不得使用cast将一个函数指针转换为任何其他指针类型,包括函数指针类型 | 要求 | 是 |
Rule 5-2-7 | 不得直接或间接将一个具有指针类型的对象转换为不相关的指针类型 | 要求 | 是 |
Rule 5-2-8 | 不得将具有整数类型或void指针类型的对象转换为具有指针类型的对象 | 要求 | 是 |
Rule 5-2-9 | 不应使用cast把指针类型转换为整数类型 | 建议 | 否 |
Rule 5-2-10 | 在表达式中,自增(++)和自减(--)运算符不应与其他运算符混合使用 | 建议 | 否 |
Rule 5-2-11 | 不得重载逗号运算符、&&运算符和||运算符 | 要求 | 是 |
Rule 5-2-12 | 作为函数实参传递的数组类型的标识符不得退化为指针 | 要求 | 是 |
一元表达式 |
---|
Rule 5-3-1 | !运算符、逻辑运算符&&或||的每个操作数都必须是bool类型 | 要求 | 是 |
Rule 5-3-2 | 一元减法运算符不得用于底层类型为无符号类型的表达式 | 要求 | 是 |
Rule 5-3-3 | 不得重载一元&操作符 | 要求 | 是 |
Rule 5-3-4 | sizeof运算符的操作数的求值不得含有副作用 | 要求 | 是 |
移位运算符 |
---|
Rule 5-8-1 | 移位运算符的右操作数的范围下限为零,上限须比左操作数的底层类型的位宽度小一 | 要求 | 是 |
逻辑与运算符 |
---|
Rule 5-14-1 | 逻辑与(&&)和逻辑或(||)运算符的右操作数不得含有副作用 | 要求 | 是 |
赋值运算符 |
---|
Rule 5-17-1 | 必须保留二元运算符及其赋值运算符形式之间的语义等价 | 要求 | 否 |
逗号运算符 |
---|
Rule 5-18-1 | 不得使用逗号运算符(,) | 要求 | 是 |
常量表达式 |
---|
Rule 5-19-1 | 对无符号常量表达式进行求值不应导致回绕 | 建议 | 否 |
语句 |
---|
表达式语句 |
---|
Rule 6-2-1 | 不得在子表达式中使用赋值运算符 | 要求 | 是 |
Rule 6-2-2 | 不得直接或间接地对浮点表达式进行相等性或不等性测试 | 要求 | 是 |
Rule 6-2-3 | 在预处理之前,null语句只能单独一行出现;如果null语句后接的第一个字符是空格,那么该语句可后接一条注释 | 要求 | 是 |
复合语句 |
---|
Rule 6-3-1 | 构成switch、while、do...while或for语句主体的语句必须为复合语句 | 要求 | 是 |
选择语句 |
---|
Rule 6-4-1 | 一个if(条件)结构必须后接一个复合语句;else关键字必须后接一个复合语句或另一个if语句 | 要求 | 是 |
Rule 6-4-2 | 所有if … else if结构都必须以一个else语句终止 | 要求 | 是 |
Rule 6-4-3 | switch语句必须为良构(well-formed) | 要求 | 是 |
Rule 6-4-4 | switch标号只得出现在构成switch语句主体的复合语句的最外层 | 要求 | 是 |
Rule 6-4-5 | 每个非空的switch子句都必须以一个无条件的throw或break语句终止 | 要求 | 是 |
Rule 6-4-6 | switch语句的最后一个子句必须是default子句 | 要求 | 是 |
Rule 6-4-7 | switch语句的条件不得是bool类型 | 要求 | 是 |
Rule 6-4-8 | 每个switch语句至少必须有一个case子句 | 要求 | 是 |
迭代语句 |
---|
Rule 6-5-1 | for循环中必须有且仅有一个循环计数器,该计数器不得为浮点类型 | 要求 | 是 |
Rule 6-5-2 | 如果不是使用--或++修改循环计数器,那么在条件中,循环计数器只能作为<=、<、>或>=的操作数 | 要求 | 是 |
Rule 6-5-3 | 不得在条件或语句中修改循环计数器 | 要求 | 是 |
Rule 6-5-4 | 应通过以下其中一种方式修改循环计数器:--、++、-=n或+=n;其中n在循环过程中保持不变 | 要求 | 是 |
Rule 6-5-5 | 不得在条件或表达式中修改循环控制变量(循环计数器除外) | 要求 | 是 |
Rule 6-5-6 | 除了在语句中被修改的循环计数器外,其他的循环控制变量应具有bool类型 | 要求 | 是 |
跳转语句 |
---|
Rule 6-6-1 | goto语句引用的标号(label)必须在同一代码块或上级代码块中声明 | 要求 | 是 |
Rule 6-6-2 | goto语句只得跳转到同一函数主体中在其后声明的标号(label) | 要求 | 是 |
Rule 6-6-3 | continue语句只能在是良构(well-formed)的for循环中使用 | 要求 | 是 |
Rule 6-6-4 | 对于任何迭代语句,用于终止循环的break或goto语句不得超过一个 | 要求 | 是 |
Rule 6-6-5 | 函数结尾必须有且仅有一个退出点 | 要求 | 是 |
声明 |
---|
说明符 |
---|
Rule 7-1-1 | 不修改的变量必须使用const修饰 | 要求 | 是 |
Rule 7-1-2 | 如果函数形参不被修改,那么必须将相对应的形参的指针或引用声明为const指针或const引用 | 要求 | 是 |
枚举声明 |
---|
Rule 7-2-1 | 具有enum底层类型的表达式只应包含与枚举的枚举器对应的值 | 要求 | 是 |
命名空间 |
---|
Rule 7-3-1 | 全局命名空间只能包含main、命名空间声明和extern “C”声明 | 要求 | 是 |
Rule 7-3-2 | 标识符main不得用于除全局函数main之外的函数 | 要求 | 是 |
Rule 7-3-3 | 头文件中不得存在未命名的命名空间 | 要求 | 是 |
Rule 7-3-4 | 不得使用using指令 | 要求 | 是 |
Rule 7-3-5 | 同一命名空间中对一个标识符的多个声明不得跨越该标识符的using声明 | 要求 | 是 |
Rule 7-3-6 | 不得在头文件中使用using指令或using声明(不包括类作用域或函数作用域的using声明) | 要求 | 是 |
asm声明 |
---|
Rule 7-4-1 | 所有汇编器的使用必须备有文件 | 强制 | 否 |
Rule 7-4-2 | 只能使用asm声明引入汇编器指令(assembler instructions) | 要求 | 是 |
Rule 7-4-3 | 必须独立封装汇编语言 | 要求 | 是 |
链接规范 |
---|
Rule 7-5-1 | 函数不应返回在该函数中定义的自动变量(包括形参)的引用或指针 | 要求 | 是 |
Rule 7-5-2 | 不得将自动存储对象的地址赋给在该对象不复存在后仍然可能存在的另一个对象 | 要求 | 是 |
Rule 7-5-3 | 如果一个形参是通过引用或const引用传递的,那么函数不得返回该形参的引用或指针 | 要求 | 是 |
Rule 7-5-4 | 函数不应直接或间接调用自身 | 建议 | 否 |
声明符 |
---|
一般规则 |
---|
Rule 8-0-1 | 初始化声明符列表(init-declarator-list)只能包含一个初始化声明符;成员声明符列表(member-declarator-list)只能包含一个成员声明符 | 要求 | 是 |
声明符的含义 |
---|
Rule 8-3-1 | 覆盖虚拟函数中的形参必须使用与被它们覆盖的函数相同的默认实参,否则不得指定任何默认实参 | 要求 | 是 |
函数定义 |
---|
Rule 8-4-1 | 不得使用省略号定义函数 | 要求 | 是 |
Rule 8-4-2 | 函数的重新声明中用作形参的标识符必须与原声明中的标识符相同 | 要求 | 是 |
Rule 8-4-3 | 所有从具有非void返回类型的函数中退出的路径都应该具有包含表达式的显式return语句 | 要求 | 是 |
Rule 8-4-4 | 函数标识符必须用来调用该函数,否则必须加上前缀“&” | 要求 | 是 |
初始化器 |
---|
Rule 8-5-1 | 所有变量在使用前都必须先定义一个值 | 要求 | 是 |
Rule 8-5-2 | 数组和结构体进行非零初始化时,必须使用大括号来指示和匹配结构 | 要求 | 是 |
Rule 8-5-3 | 枚举器列表中,不得将=结构用于显式初始化非首位成员之外的成员,除非所有的项都被显式初始化 | 要求 | 是 |
类 |
---|
成员函数 |
---|
Rule 9-3-1 | const成员函数不得返回对 *类数据* 的非const指针或引用 | 要求 | 是 |
Rule 9-3-2 | 成员函数不得返回指向类数据的非const句柄 | 要求 | 是 |
Rule 9-3-3 | 如果一个成员函数可以是静态的,那么就必须将其设为静态,否则,如果该函数可以是const的,那么就必须将其设为const | 要求 | 是 |
联合体 |
---|
Rule 9-5-1 | 不得使用联合体 | 要求 | 是 |
位域 |
---|
Rule 9-6-1 | 需要对代表一个位域的位进行绝对定位时,必须记录位域的行为和包装 | 强制 | 否 |
Rule 9-6-2 | 位域必须是bool类型,或显式无符号/有符号整数类型 | 要求 | 是 |
Rule 9-6-3 | 位域不得具有enum类型 | 要求 | 是 |
Rule 9-6-4 | 已命名的有符号整数类型的位域长度必须超过一位 | 要求 | 是 |
派生类 |
---|
多个基类 |
---|
Rule 10-1-1 | 不应使用虚拟基来派生类 | 建议 | 否 |
Rule 10-1-2 | 只有在用于菱形层次结构(diamond hierarchy)时,才能声明一个基类为虚拟基类 | 要求 | 是 |
Rule 10-1-3 | 可访问基类在同一层次结构中不能同时为虚基类和非虚基类 | 要求 | 是 |
查找成员名称 |
---|
Rule 10-2-1 | 在一个多重继承层次结构中,所有可访问的实体名称都应该是唯一的 | 建议 | 否 |
虚拟函数 |
---|
Rule 10-3-1 | 在整个继承层次结构中,每个虚拟函数在每个路径中的定义不应超过一个 | 要求 | 是 |
Rule 10-3-2 | 每个覆盖虚拟函数都必须用关键字virtual来声明 | 要求 | 是 |
Rule 10-3-3 | 如果虚拟函数被声明为纯虚函数,则该虚拟函数只能被纯虚函数覆盖 | 要求 | 是 |
成员访问控制 |
---|
一般规则 |
---|
Rule 11-0-1 | 在非POD类中,成员数据必须是私有的 | 要求 | 是 |
特殊成员函数 |
---|
构造函数 |
---|
Rule 12-1-1 | 不得在一个对象的构造函数或析构函数的主体中使用该对象的动态类型 | 要求 | 是 |
Rule 12-1-2 | 所有类构造函数都应明确地调用它们所有直接基类和虚拟基类的构造函数 | 建议 | 否 |
Rule 12-1-3 | 所有可以用基本类型的单个实参进行调用的构造函数都应被显式声明 | 要求 | 是 |
复制类对象 |
---|
Rule 12-8-1 | 复制构造函数(copy constructor)只得用来初始化它的基类以及它所属的类的非静态成员 | 要求 | 是 |
Rule 12-8-2 | 在抽象类中,复制赋值运算符必须被声明为受保护的(protected)或私有的(private) | 要求 | 是 |
模板 |
---|
模板声明 |
---|
Rule 14-5-1 | 非成员泛型函数只能在不是关联命名空间(associated namespace)的命名空间中声明 | 要求 | 是 |
Rule 14-5-2 | 如果模板构造函数只有一个形参,且为泛型形参,那么必须声明一个复制构造函数 | 要求 | 是 |
Rule 14-5-3 | 如果模板赋值运算符有一个泛型形参,那么必须声明一个复制赋值运算符 | 要求 | 是 |
名称解析 |
---|
Rule 14-6-1 | 在一个有依赖基的类模板中,必须使用带修饰的标识符或this->来引用任何可能在该依赖基中查找到的名称 | 要求 | 是 |
Rule 14-6-2 | 通过重载解析选择的函数必须被解析为翻译单元中先前声明的函数 | 要求 | 是 |
模板实例化与专门化 |
---|
Rule 14-7-1 | 所有类模板、函数模板、类模板成员函数和类模板静态成员至少必须被实例化一次 | 要求 | 是 |
Rule 14-7-2 | 对于任何给定的模板专门化,使用专门化的模板实参对该模板进行显式实例化,不得导致程序非良构(ill-formed) | 要求 | 是 |
Rule 14-7-3 | 模板的所有部分专门化和显式专门化的声明必须与主模板的声明在同一文件 | 要求 | 是 |
函数模板专门化 |
---|
Rule 14-8-1 | 重载的函数模板不得被显式专门化 | 要求 | 是 |
Rule 14-8-2 | 对函数调用可行的函数集不应包含任何函数专门化,或者应只包含函数函数专门化 | 建议 | 否 |
异常处理 |
---|
一般规则 |
---|
Rule 15-0-1 | 异常只得用于错误处理 | 强制 | 否 |
Rule 15-0-2 | 异常对象不应具有指针类型 | 建议 | 否 |
Rule 15-0-3 | 不得使用goto或switch语句将控制权转移到try或catch块中 | 要求 | 是 |
抛出异常 |
---|
Rule 15-1-1 | throw语句的赋值表达式本身不得导致抛出异常 | 要求 | 是 |
Rule 15-1-2 | 不得显式抛出NULL | 要求 | 是 |
Rule 15-1-3 | 空的抛出(throw;)只得在捕获(catch)处理程序的复合语句中使用 | 要求 | 是 |
处理异常 |
---|
Rule 15-3-1 | 只有程序启动后和终止前才能报告异常 | 要求 | 否 |
Rule 15-3-2 | 至少应该有一个异常处理程序来捕获所有未经处理的异常 | 建议 | 否 |
Rule 15-3-3 | 对于类构造函数或类析构函数,其函数尝试块实现的处理程序不得引用该类或其基类的非静态成员 | 要求 | 是 |
Rule 15-3-4 | 对于在代码中显式抛出的每个异常,在所有可能导致该异常的调用路径上,都必须有一个兼容类型的处理程序 | 要求 | 否 |
Rule 15-3-5 | 必须始终通过引用来捕获类类型的异常 | 要求 | 是 |
Rule 15-3-6 | 如果在一个尝试捕获(try-catch)语句或函数尝试块中,为一个派生类以及它的部分或全部基类提供了多个处理程序,那么应按从最终派生类到基类的顺序排列这些处理程序 | 要求 | 是 |
Rule 15-3-7 | 如果在一个尝试捕获语句或函数尝试块中提供了多个处理程序,那么所有省略号(catch-all)处理程序必须在最后发生 | 要求 | 是 |
异常规范 |
---|
Rule 15-4-1 | 如果一个函数与异常规范(exception-specification)一起声明,那么该函数在其他翻译单元中的所有声明必须以相同的类型标识(type-id)集声明 | 要求 | 是 |
异常函数 |
---|
Rule 15-5-1 | 类析构函数不得随着异常退出 | 要求 | 是 |
Rule 15-5-2 | 当函数的声明包含一个异常规范时,该函数只能抛出指定类型的异常 | 要求 | 是 |
Rule 15-5-3 | 不得隐式调用terminate()函数 | 要求 | 是 |
预处理指令 |
---|
一般规则 |
---|
Rule 16-0-1 | 文件中的#include指令之前只能是其他预处理指令或注释 | 要求 | 是 |
Rule 16-0-2 | 只能在全局命名空间中对宏进行#define和#undef | 要求 | 是 |
Rule 16-0-3 | 不得使用#undef | 要求 | 是 |
Rule 16-0-4 | 不得定义类函数宏 | 要求 | 是 |
Rule 16-0-5 | 传递给类函数宏的实参不得包含形似预处理指令的标记 | 要求 | 是 |
Rule 16-0-6 | 在定义类函数宏时,每个实参的实例都必须以小括号括起来,除非它们是#或##的操作数 | 要求 | 是 |
Rule 16-0-7 | 未定义的宏标识符不得用于#if和#elif预处理指令,除非是作为defined预处理运算符的操作数 | 要求 | 是 |
Rule 16-0-8 | 如果#标识符是行中的第一个标记,则其后应紧接预处理标识符 | 要求 | 是 |
条件包含 |
---|
Rule 16-1-1 | defined预处理运算符只能使用两种标准形式之一 | 要求 | 是 |
Rule 16-1-2 | 所有的 #else、#elif 和 #endif 预处理指令必须都必须和对应的 #if 或 #ifdef 指令位于同一文件中 | 要求 | 是 |
源文件包含 |
---|
Rule 16-2-1 | 预处理器只得用于文件包含和#include防范(include guard) | 要求 | 是 |
Rule 16-2-2 | C++的宏只得用于#include防范、类型限定符或存储类标识符 | 要求 | 是 |
Rule 16-2-3 | 必须提供#include防范 | 要求 | 是 |
Rule 16-2-4 | 头文件名称里不得出现'、"、/*或//字符 | 要求 | 是 |
Rule 16-2-5 | 头文件名称里不能出现\字符 | 建议 | 否 |
Rule 16-2-6 | #include 预处理指令必须后接<filename>或"filename" | 要求 | 是 |
宏替换 |
---|
Rule 16-3-1 | 在一个宏定义中最多只得出现一个#或##预处理器运算符 | 要求 | 是 |
Rule 16-3-2 | 不应使用#或##预处理器运算符 | 建议 | 否 |
Pragma指令 |
---|
Rule 16-6-1 | 必须记录所有#pragma指令的使用 | 强制 | 否 |
库的引入 |
---|
一般规则 |
---|
Rule 17-0-1 | 标准库中保留的标识符、宏和函数不得被定义、重定义或取消定义 | 要求 | 是 |
Rule 17-0-2 | 不得重复使用标准库中宏和对象的名字 | 要求 | 是 |
Rule 17-0-3 | 不得重写标准库中函数的名称 | 要求 | 否 |
Rule 17-0-4 | 所有库代码必须遵守MISRA C++规则 | 强制 | 否 |
Rule 17-0-5 | 不得使用setjmp宏和longjmp函数 | 要求 | 否 |
语言支持库 |
---|
一般规则 |
---|
Rule 18-0-1 | 不得使用C语言库 | 要求 | 是 |
Rule 18-0-2 | 不得使用库<cstdlib>中的函数atof、atoi 和 atol | 要求 | 是 |
Rule 18-0-3 | 不得使用库<stdlib.h>中的函数 abort、exit、getenv 和 system | 要求 | 是 |
Rule 18-0-4 | 不得使用库<ctime>中的时间处理函数 | 要求 | 是 |
Rule 18-0-5 | 不得使用库<cstring>中的无界函数 | 要求 | 是 |
实现属性 |
---|
Rule 18-2-1 | 不得使用宏offsetof | 要求 | 是 |
动态内存管理 |
---|
Rule 18-4-1 | 不得使用动态堆内存分配 | 要求 | 是 |
其他运行时支持 |
---|
Rule 18-7-1 | 不得使用<csignal>中的信号处理功能 | 要求 | 是 |
诊断库 |
---|
错误代码 |
---|
Rule 19-3-1 | 不得使用错误指示器errno | 要求 | 是 |
输入_输出库 |
---|
一般规则 |
---|
Rule 27-0-1 | 不得使用输入/输出流库<cstdio> | 要求 | 是 |