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

news2024/11/23 2:58:41

073625667591d2a93997f025acae3356.gif

正文


大家好,我是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 )
C991999年发布(ISO/IEC 9899: 1999)
C112011年发布(ISO/IEC 9899: 2011)

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

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

IAR编译器中:

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

还有特别多吧,这里没办法一一列举了,感兴趣的朋友可以去参考下C99标准的文档。

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

最后一个bug,bug菌唯一创作平台~

f38420006afe484ea3d96340a1494766.jpeg

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 d11bfff6b7aa6735255f8d2c30d89c9e.gif

☞  嵌入式C语言进阶专辑 da6c6c3249137519f9988cdd162ed0ca.gif

☞  “bug说”专辑 fe4ae2dd06ba8d989d18d5e4ff2d4f9a.gif

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

46546ea4b0f5cc0635846684f5d4239e.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows虚拟机中docker运行springboot容器报错:Unable to access jarfile /app.jar

1.在Windows系统中创建了虚拟机&#xff0c;并且在虚拟机中安装了docker&#xff0c;但是在使用Dockerfile创建镜像并且运行时报错 2.使用shell脚本运行的&#xff0c;并且检查后也没有发现文件或者路径有错 解决&#xff1a; 使用vim加参数的形式打开shell脚本&#xff0c;可以…

微服务架构下的认证鉴权解决方案

背景 单体应用在向微服务化架构演进时&#xff0c;需要考虑如何解决服务认证授权的问题。如果处理不好&#xff0c;会引发架构的混乱&#xff0c;带来安全、性能、难以维护的问题。 以最典型的包含WEB页面的具备登录态管理的系统为例。在最初阶段&#xff0c;登录鉴权一般通过…

文华财经期货技术分析日内多空信号共振指标公式,波段行情短线抄单操盘幅图指标

​期货交易的很大一个误区是“痴迷于各种指标公式” 大家千万不要痴迷于指标&#xff0c;记住一点:行情软件界面之中的K线图叫主图&#xff0c;其余指标叫附图。 这从叫法上就该知道&#xff0c;我们寻找买卖点要在主图K线上来寻找&#xff0c;指标只是起到辅助分析的作用&…

操作系统02_内存分页管理_分段管理_设备管理_IO处理_索引文件结构_文件目录_位示图---软考高级系统架构师007

存储管理可以分为固定存储管理和分页存储管理。 现在固定存储管理已经不用也不考,但要知道因为固定存储管理指的是整存整取 也就是把一整个程序,比如说10G的游戏全部都存到内存里 这样的话是非常占用内存的,这个固定存储管理现在已经不用了。 然后这里我们主要看分页存储管: …

蓝桥杯比赛 NOC竞赛C++项目选择题真题和模拟题汇总

题目来源&#xff1a;第10届蓝桥杯青少年组C选拔赛 1、下面哪个密码最安全 A. 111111 B. 123456 C. qwerty D. Z2a8Q1 2、如果今天是星期六&#xff0c;再过60天是星期几&#xff1f; A. 星期三 B. 星期四 C. 星期五 D. 星期六 3、90到100之间有几个素数&#xff1f; …

mmcv和openCV两个库imcrop()和imresize()方法的对应【基础分析】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录MMCV 全家桶mmcv.imresize(img, (1000, 600), return_scaleTrue) 方法实现对应的…

Unity 之 Post Processing后处理不同项目配置(URP项目配置)

Unity 之 Post Processing后处理不同项目配置&#xff08;URP项目配置&#xff09;一&#xff0c;Post Processing介绍二&#xff0c;正常项目配置2.1 场景配置2.2 摄像机配置2.3 集成步骤小结三&#xff0c;URP项目配置3.1 具体配置步骤3.2 最终实现效果四&#xff0c;代码控制…

【每天一个cmake技巧】简单的cmake demo

简单的cmake demo 一个简单的cmake 工程&#xff0c;包括生成动态库和链接动态库的demo工程和test工程。 demo下载链接&#xff1a; https://download.csdn.net/download/sinat_35178307/87243966 目录结构 该工程可以生成一个dll&#xff0c;一个调用dll的demo&#xff0c;…

【数据分享】维基百科Wiki负面有害评论(网络暴力)文本数据多标签分类挖掘可视化...

原文链接&#xff1a;http://tecdat.cn/?p8640讨论你关心的事情可能很困难。网络暴力骚扰的威胁意味着许多人停止表达自己并放弃寻求不同的意见&#xff08;查看文末了解数据免费获取方式&#xff09;。平台努力有效地促进对话&#xff0c;导致许多社区限制或完全关闭用户评论…

C++中的菱形继承问题及解决方案

存在问题 C中支持多重继承&#xff0c;但是由于这个特性&#xff0c;导致会有如下继承关系。 这样&#xff0c;类D就会同时拥有从类B中继承下来的A中的函数&#xff0c;也会拥有从类C中继承下来的A中的函数&#xff0c;会产生模糊调用的现象。 解决方案 为了解决这个问题&a…

spring源码 - AOP原理理解

AOP使用 1.我们都知道我们在使用spring aop时需要在configuration类上增加EnableAspectJAutoProxy 2.然后在准备AOP类就可以对相应类的方法进行aop Component Aspect public class MyAspect { Pointcut("execution(* com.my.service.*.*(..))") public void as…

利用WSL2搭建Qemu仿真Vexpress-a9开发环境

利用WSL2搭建Qemu仿真Vexpress-a9开发环境开发环境搭建更新软件源uboot-tools安装交叉编译环境安装qemu安装编译linux镜像和DBT文件启动qemu仿真kernelbusybox制作根文件系统制作rootfs使用u-boot启动kernel下载编译u-bootu-boot利用tftp网络引导方式启动Linux内核WSL2主机网络…

火爆朋友圈的ChatGPT是什么?

火爆朋友圈的ChatGPT是什么&#xff1f; 官方博客&#xff1a;https://openai.com/blog/chatgpt/ 背景 OpenAI&#xff0c;在美国成立的人工智能研究公司。2015年&#xff0c;OpenAI由马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得…

Java入门教程(14) ——Scanner 获取键盘输入

在后台开发中&#xff0c;我们可能需要在运行的时候传递一些参数进去&#xff0c;该怎么处理呢&#xff1f; Java 提供了一个 Scanner 类&#xff0c;利用这个类&#xff0c;我们可以很方便的获取键盘输入的参数&#xff0c;接下来给大家详细介绍一下 1.首先导包 import jav…

到底什么是类脑计算?

当前感存算一体化的类脑神经拟态芯片流行&#xff0c;对其类脑计算的定义各家有各家的说法。但总之&#xff0c;类脑计算就是模拟人类思考方式的一种计算。 本文摘编自《类脑计算》&#xff08;危辉著. 北京&#xff1a;科学出版社, 2022. 7&#xff09;一书“第1 章什么是类脑…

“在别人恐惧时贪婪”,这支基金将在“自动驾驶寒冬”加大投资力度

交流群 | 进“传感器群/滑板底盘群”请加微信号&#xff1a;xsh041388交流群 | 进“汽车基础软件群”请加微信号&#xff1a;Faye_chloe备注信息&#xff1a;群名称 真实姓名、公司、岗位前段时间&#xff0c;Argo“关闭”的消息将寒气传给了全球自动驾驶产业的每一个人。再加…

[附源码]计算机毕业设计图书馆出版物预订系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C#语言实例源码系列-实现批量图片格式转换

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

极客时间Kafka - 02 为什么要分区|生产者的分区策略|轮询策略|随机策略|消息键保序策略

文章目录1. 为什么分区&#xff1f;2. Kafka 生产者的分区策略1. 轮询策略 RoundRobinPartitioner2. 随机策略 UniformStickyPartitioner3. 按消息键保序策略 DefaultPartitioner我们在使用 Apache Kafka 生产和消费消息的时候&#xff0c;肯定是希望能够将数据均匀地分配到所有…

Jenkins-jenkins凭证管理与代码拉取

什么是凭证&#xff1f; Jenkins经常与第三方插件如git&#xff0c;docker等交互&#xff0c;需要提供第三方的凭证&#xff0c;比如access token&#xff0c;用户名和密码等 可以使用插件Credentials Binding Plugin来管理这些凭证 jenkins凭证类型 jenkins可以管理以下凭证…