五、《MISRA C》学习笔记五(规则7/8/9),2022.12.14

五、《MISRA C》学习笔记五,2022.12.14

  1. 规则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
        
  2. 规则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(强制): 当一个数组声明为具有外部链接,它的大小应该显式声明或者通过初始化进行隐式定义
  3. 规则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 */
      
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值