MISRA C 语言编程规范 良好的C语言编程习惯 提高c语言代码质量

本文章是基于Misra C coding stardand写的,因为原文是技术书,所以我在这里用我的理解给大家解释一下。什么是MISRA C编程规范呢,其实就是为了保证代码的规范而定义的一套c语言的规则而已。广泛应用于汽车领域中。

rule2.2 源代码应该使用/*...*/类型的注释。良好的习惯,虽然很多编译器也都支持//注释,但是不同的编译器可能会造成很多不同的麻烦。

rule2.3 不要在/*...*/中再次进行/*...*/注释了,会造成编译器的误解,因为不支持嵌套的注释。

rule3.5 在嵌入式系统中,因为很多变量不是0就是1或者2, 3,4,这些值都不是很大,为了节约嵌入式中的可怜的空间,我们就使用位域的方法,这个问题是很有意思的问题,这个问题就能描述清楚数据在嵌入式系统中的资源分配问题。

struct message{
    unsigned int isCarRunning:1
    unsigned int isEngineStop:1
    unsigned int lightNumber:4
}

上面是什么意思呢,就是在内存中isOpen怎么分配的问题,其实在这里也有很多讲究:有兴趣的童鞋可以查看编译器的资料,主要有两点需要大家注意:

1, 就是大小端问题,迷惑了很多学者的问题,说白了就是一个字节中是从低位往高位排还是高位往低位排的问题。就像老师让学生排队,谁排在第一位都无所谓,但是我们在设计的时候我们要清楚谁站在了第一位,简单写个程序测一下就知道啦或者看你用的哪个编译器看一下就知道啦

2.还有就是一个很蛋疼的问题,就是位域是否重叠,这个如果清楚的话就会知道整个结构体的大小了,不然你还是迷迷糊糊,举个例子我们都知道一个字节占8位,假如现在让你顺序存储一个6位的数和4位的数,当你把6位的数存储结束之后,后面的四位的这个数是从剩下的两位开始存储还是另起炉灶从下个字节开始存储。这个问题想要搞清楚,具体的编译器有具体的做法。这样你就自己会计算出来你这个结构体的大小了。

我自己觉得这一条还是很重要的,对于内存的分配问题尤为重要,希望大家能够理解里面的精髓。

rule5.2 

int i;
{
    int i;/*由于c语言中域的概念,这个i会隐藏掉全局变量(上面一个变量)*/
    i = 5;/*这个地方给后面的读者造成了灾难,当代码量大的时候,鬼知道你要往哪里赋值*/
}

在这个函数内,就相当于隐藏了第一行的i,那么这条规则你就不符合了,所以良好的编程习惯和命名规则还是要好点的。

rule5.3 typedef应当是唯一的标识符,什么意思呢,其实也很简单,比方说

typedef unsigned char uint8_t
typedef unsigned char uint8_t/*这样做是违法的,同一个人uint8_t,你不能把人家搞两次*/
unsigned char uint8_t/*这也是违法的,应该没有人这样做吧,哪有这么命名变量的吧*/

大型项目当中,应该有个专门的文件来管理这些东西,为了这些烦人的事情发生,把时间浪费在这个上面是毫无意义的。

rule5.4 标签(tag)名称必须是唯一的标识符,比方说

struct stag { uint16_t a; uint16_t b;};
struct stag temp = {0, 0}/*这样做是合法的,目前是没有问题的,那么看下一行有没有什么惊喜*/
union  stag temp2 = {0, 0}/*不合法的,怎么可能这样搞,stag没有这么渣吧,一下是搞不了两个的,这样编译器就会不知道你是干嘛的*/

也就是说尽量使用清晰明了的标识符,这样既增加后面人的可读性,又不会出现各种麻烦。

rule6.1&6.2 好好见识一下什么是char,你可能并不了解,有单纯的char(这个东东和asii码有着千丝万缕的联系,如果不用它,就尽量别去惹,说不准会很麻烦),signed char,unsigned char, 后面两个一般用于数字型数据,char用于字符型数据,char类型的变量所能接受的只有赋值和等于操作符(=,==,!=)别乱搞什么>=这些不等式,这样会造成麻烦,但是unsigned char, signed char这两个是可以的。

rule6.3 应该使用指示了大小和符号的typedef以代替基本的数据类型,就是说不要用unsigned char temp;这样定义变量,尽量使用typedef unsigned char uint8_t;  uint8_t temp;这样来定义变量。原因就是简单。后面人看起来也不费劲。

rule6.4这条规则说我们在定义位域的时候不能enum, short,或者char类型,只能用int型的,原文中说其他

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值