嵌入式编程别忽略了C语言的标准

嵌入式技术

1412人已加入

描述

正文

大家好,我是bug菌~

最近做代码评审发现很多同事的编码都游走在风险的边沿,其中最显眼的就是局部变量定义位置比较随意。

对于C语言编程老手而言,绝大部分都已经养成了"变量定义必放在语句块的开头"这一习惯,依稀还记得那时候学校老师在课堂上强调C语言的局部变量一定要放在函数的开头。

void Function(void)
{
    int Var1 = 0;
    int Var2 = 0;
    //do someting......

}

 

刚开始学习C语言的时候,感觉也没啥好解释的,照着书上和老师的"规矩"来就可以了,后来又学习了C++,C++对这一块相对就比较灵活,注意一下作用域,随时定义随时用,不需要遵循变量定义必须放在函数开头这一规则。

 

void Function(void)
{
    int Var1 = 0;
    //do someting......
    int Var2 = 0;
    //do someting......

}

 


直到很久很久以前有一次看到别人的C程序也可以像C++这样灵活的定义变量,才认识到C语言还有不同的标准,也是从那以后开始了解C语言的标准。


所谓"无规矩、不成方圆",不同的编译器会根据不同的标准引入相关的"规矩"来约束和指导编程人员进行程序设计。


C语言作为嵌入式领域主力的编程语言,自然也应该不断的修正和优化,那得有专门的人来做这些事 -- C语言标准化委员会,目前编译器主要参考的有三个标准:

C89(C90) 1989年批准、1990年发布(ISO/IEC 9899: 1990 )
C99 1999年发布(ISO/IEC 9899: 1999)
C11 2011年发布(ISO/IEC 9899: 2011)


当然啦,据了解目前的标准都已经更新到了C17,但具体哪些编译器对其进行了支持,那又是另外一个故事了。


编译器为了满足不同开发者的需求,以及新旧代码工程的兼容,都会把C语言标准的相关选择放开到编译选项中,开发人员根据自身需求进行选择编译自己的工程源码,我们来看看,比如:


IAR编译器中:

嵌入式

GCC编译器中:

GCC提供了一些C程序编译的扩展选项,使用-std来进行设置,比如编译的时候选择-std=gnu99,对应着GUN对C99的的一些扩展。

特别在进行代码的移植等等方面,对于当前手头工具所遵循的C标准还是要心里有数的,不然一大堆编译错误,够你折腾的。

前面bug菌聊到,虽然C语言标准是在不断的更新,然而编译器却不一定同步支持,纵观大部分嵌入式编译器绝大多数还停留在最高仅支持C99的标准,甚至还不一定全面支持该标准。

个人觉得主要的原因还是对于相关的标准实现起来比较繁琐,同时在相关领域使用的频率实在是太低,所以没有得到全面支持,当然了,有一些编译器为了更好的客户体验,还会加入自身的一些特殊扩展。 那么bug菌这里简单罗列了一下相对于C89标准,C99标准所新增的一些常用的标准项目:

1、预处理,行注释"//"的支持;

2、inline内联关键字,内联函数的支持;

3、变量声明不必放在语句块的开头,这也是前面提到的,支持该特性以后for循环常用的一种方式是:for(int i=0;i<100;i++) ;

4、对数组的增强,可变长数组;

5、加入了__func__预定义标识符;

6、不再支持隐式返回,有返回值比如return;

7、对整形提升的修改,其级别低于int或unsignedint的任何整数类型均可被替换成int或unsignedint类型。 还有特别多吧,这里没办法一一列举了,感兴趣的朋友可以去参考下C99标准的文档。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分