五、《MISRA C》学习笔记五,2022.12.14
- 规则7——常量
- 规则 7.1(强制): 不应使用八进制常量(零除外)和八进制 escape 序列
释义:Escape Sequence:转义序列,反斜杠开头是叫转义序列- char ch = ‘\101’; 等价于 char ch = 0101; (以0开头的表示八进制),\ooo 是对用三位八进制数转义表示任意字符的形象化描述
- \xhh 里面是 x 是固定的,表示十六进制(hexadecimal),h 也表示十六进制,char ch = ‘\x41’; 就是用十六进制来表示,它与前面的 \101 是等价的
- code[1] = 109; /* equivalent to decimal 109 */
- code[3] = 052; /* equivalent to decimal 42 */
- code[5] = ‘\109’ ; /* implementation-defined, two character constant */这个语句里边出现了9,超出了八进制的范畴,导致其字符常量包含了两个字符,“\10”和“9”
#include <stdio.h> int main(){ printf("%c,%c,%c,%c", 0101, '\101', '\x41', 'A','\109'); return 0; } //打印的结果:A,A,A,A,9
- 规则 7.1(强制): 不应使用八进制常量(零除外)和八进制 escape 序列
- 规则8——声明与定义
- 规则 8.1(强制): 函数应当具有原型声明,且原型在函数的定义和调用范围内都是可见的
- 规则 8.2(强制): 不论何时声明或定义了一个对象或函数,它的类型都应显式声明
- 规则 8.3(强制): 函数的每个参数类型在声明和定义中必须是等同的,函数的返回类型也该是等同的
- 规则 8.4(强制): 如果对象或函数被声明了多次,那么它们的类型应该是兼容的
- 规则 8.5(强制): 头文件中不应有对象或函数的定义
头文件应该用于声明对象、函数、typedef 和宏,而不应该包含或生成占据存储空间的对象或函数(或它们的片断)的定义。这样就清晰地划分了只有 C 文件才包含可执行的源代码,而头文件只能包含声明 - 规则 8.6(强制): 函数应该声明为具有文件作用域
在块作用域中声明函数会引起混淆并可能导致未定义的行为 - 规则 8.7(强制): 如果对象的访问只是在单一的函数中,那么对象应该在块范围内声明
- 规则 8.8(强制): 外部对象或函数应该声明在唯一的文件中
- 规则 8.9(强制): 具有外部链接的标识符应该具有准确的外部定义
- 规则 8.10(强制): 在文件范围内声明和定义的所有对象或函数应该具有内部链接,除非是在需要外部链接的情况下
即如果一个变量或者是函数对象仅在同一个文件中使用,加上static - 规则 8.11(强制): static 存储类标识符应该用于具有内部链接的对象和函数的定义和声明
- 规则 8.12(强制): 当一个数组声明为具有外部链接,它的大小应该显式声明或者通过初始化进行隐式定义
- 规则9——初始化
- 规则 9.1(强制): 所有自动变量在使用前都应被赋值
这是由于:ISO C标准中具有静态存储期的变量缺省地被自动赋予零值,除非经过了显式的初始化。在一些嵌入式环境中,可能存在不是自动赋零的情况。 - 规则 9.2(强制): 应该使用大括号以指示和匹配数组和结构的非零初始化构造
需要使用附加的大括号来指示嵌套的结构。显式地考虑和描述复杂数据类型元素(比如,多维数组)的初始化次序:int16_t y[3][2] = { 1, 2, 3, 4, 5, 6 }; /* not compliant */ int16_t y[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } } ; /* compliant */
- 规则 9.3(强制): 在枚举列表中,“=”不能显式用于除首元素之外的元素上,除非所有的元素都是显式初始化的
- 如果枚举列表的成员没有显式地初始化,那么 C 将为其分配一个从 0 开始的整数序列,首元素为 0,后续元素依次加 1
- 首元素的显式初始化迫使整数的分配从这个给定的值开始。当采用这种方法时,重要的是确保所用初始化值一定要足够小,这样列表中的后续值就不会超出该枚举常量所用的 int 存储量
enum colour { red = 3, blue, green, yellow = 5 } ; /* not compliant */ /* green and yellow represent the same value – this is duplication */ enum colour { red = 3, blue = 4, green = 5, yellow = 5 }; /* compliant */ /* green and yellow represent the same value – this is duplication */
- 规则 9.1(强制): 所有自动变量在使用前都应被赋值