这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 嵌入式编程别忽略了C语言的标准

共23条 1/3 1 2 3 跳转至

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

高工
2022-12-13 22:28:16     打赏
最近做代码评审发现很多同事的编码都游走在风险的边沿,其中最显眼的就是局部变量定义位置比较随意。

对于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语言标准化委员会,目前编译器主要参考的有三个标准:

image.png

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

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

IAR编译器中:

image.png


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类型。





关键词: 嵌入式     编程     标准    

院士
2022-12-13 22:50:39     打赏
2楼

看看


专家
2022-12-14 08:46:17     打赏
3楼

谢谢分享,养成好而变成习惯,很重要


专家
2022-12-14 08:50:40     打赏
4楼

谢谢分享


院士
2022-12-14 08:57:50     打赏
5楼

谢谢分享


高工
2023-01-04 09:38:01     打赏
6楼

谢谢分享


高工
2023-01-08 16:37:46     打赏
7楼
谢谢分享

专家
2023-01-09 06:22:14     打赏
8楼

谢谢分享


专家
2023-01-09 06:23:23     打赏
9楼

谢谢分享


专家
2023-01-09 08:18:54     打赏
10楼

谢谢分享


共23条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]