0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

将IAR EWARM的一个函数拷贝到Keil里后编译出错了?

strongerHuang 来源:strongerHuang 作者:strongerHuang 2021-04-02 10:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

有读者问了这样一个问题:我将IAR EWARM中的一个函数,拷贝到Keil MDK-ARM中之后,编译出错了?

为什么在EWARM中可以编译通过,却在MDK-ARM中会出错呢?

1

函数中变量的定义位置大家先看下代码中变量a、b、c、d定义的位置:

void Test(void){ char a; //a定义的位置 printf(“a = %d

”, a);

char b; //b定义的位置 printf(“b = %d

”, b);

for(char c = 0; c 《 10; c++) //c定义的位置 { char d; printf(“c = %d

”, c); printf(“d = %d

”, d); }}

以上变量定义位置,相信很多人都看到过,有些朋友在实际编程中也常这么定义在这些位置。

上面这段代码C编译器编译会错吗?答案:按照C89标准编译就会出错;按照C99标准编译就不会出错。

2

变量定义位置的区别

相信很多朋友在大学的时候都学过C和C++,学过C++的朋友都知道,上面那段代码变量定义的位置是很合理的。

但不知道大家了解过C89和C99的区别,区别的内容还是有很多,针对本文说下定义变量位置的区别。

C89标准是不允许在函数中随便位置声明变量,C语言中的变量声明不能放在任何可执行语句之后,只允许在函数(可执行语句)的开始处。如上一段代码,需要在【printf(“a = %d ”, a);】这条语句之前。

C99及C++放松了限制,允许在函数体内任意位置声明变量。C99新的标准满足了在函数体内定义变量立马就使用的功能。但是,也要注意变量的作用域。如下面代码就会出错:

void Test(void){ for(char c = 0; c 《 10; c++) { printf(“c = %d

”, c); } printf(“c = %d

”, c); //这里有问题}

3

MDK-ARM和EWARM中C99的配置上面说的问题,就是出在IDE的配置上。EWARM工程默认是支持C99标准的,而MDK-ARM工程默认是不支持C99标准的。所以说,将一个支持C99的标准的代码拷贝到不支持C99标准的环境中,编译就会因为代码而出错。

MDK-ARM和EWARM只需要修改一下配置就可以支持C99标准。

1.MDK-ARM的配置Project -》 Options for Target -》 C/C++ 勾选上“C99 Mode”即可。

41844d02-92ed-11eb-8b86-12bb97331649.png

2.EWARM的配置Project -》 Options -》 C/C++ Compiler -》 Language 1 选中上“C99”即可。

41b003f2-92ed-11eb-8b86-12bb97331649.png

关于变量定义的位置也有很多争议:有的人说为了兼容C89标准,都统一写在可执行语句前面;有的人则喜欢后面C99标准规定的,你认为呢?

原文标题:都是局部变量惹的祸

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    69

    文章

    1232

    浏览量

    173189
  • 变量
    +关注

    关注

    0

    文章

    616

    浏览量

    29568

原文标题:都是局部变量惹的祸

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何使用IAR编译器或IAR项目编译S32K3 MCAL项目

    本文使用S32K344结合RTD600来说明使用IAR编译编译MCAL项目以及MCAL直接导入IAR IDE项目 2.
    发表于 04-14 08:46

    Android 14→15内置可执行程序:从“野路子”“正规军”的进化

    直接把文件从源码目录拷贝到系统分区(如/system/bin),像“复制粘贴” 样简单。
    的头像 发表于 02-01 16:54 1941次阅读
    Android 14→15内置可执行程序:从“野路子”<b class='flag-5'>到</b>“正规军”的进化

    内存拷贝函数 memcpy原理及实现

    区域有重叠部分,则从末端开始对每个字节进行拷贝。但数据量大时速度慢,两种方法结合能够提高拷贝函数性能,代码如下:void *Memcpy
    发表于 12-26 08:03

    单片机使用printf打印编译出错的原因?

    单片机使用printf打印编译出错,有哪些情况?
    发表于 11-21 06:02

    CW32 MCU用什么IDE开发?

    推荐使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE开发CW32 MCU应用,其中新版本IAR EWARM直接支持CW
    发表于 11-12 07:52

    开启POSIX支持编译出错的原因?怎么解决?

    使用MDK525编译器:ARMCC V5.06,rtthread打开posix支持编译报错,提示
    发表于 09-24 06:03

    CUBEIDE调试过程中,如何数组仲的数据拷贝到电脑?

    请问,有什么办法可以在CUBEIDE 调试过程中,数组的数据拷贝到电脑上去?
    发表于 09-09 07:20

    请问如何在 Keil μVision 或 IAR EWARM 中使用观察点进行调试?

    如何在 Keil μVision 或 IAR EWARM 中使用观察点进行调试?
    发表于 08-20 06:29

    为CYBT-253059-2创建IAR项目时出错了,怎么解决?

    你好,我们目前正在开发基于 CYBT-253059-2 模块的新应用程序,并且已经可以使用“eclipse”进行些测试。 我们必须使用 IAR,因此我尝试使用项目创建器创建
    发表于 06-30 08:19

    stm32N657上部署cubeAI生成代码,编译出错的原因?怎么解决?

    你好,要怎么在stm32N657上部署cubeAI生成代码呢,编译出错,我使用cubeAI生成的手写数字模型的代码,编译报错 要怎么配置呢,我看其他AI demo都是分了两文件,这里要怎么烧录进去使用呢?
    发表于 06-20 06:31

    IAR Arm开发工具链中--function_sections编译选项的使用

    本文主要介绍在IAR Arm开发工具链中不修改源代码的情况下使用‑‑function_sections编译选项把函数放到单独的section。
    的头像 发表于 06-13 13:53 1968次阅读
    在<b class='flag-5'>IAR</b> Arm开发工具链中--function_sections<b class='flag-5'>编译</b>选项的使用

    手动添加cubeMX的软件自动生成代码编译出现’rtthread.elf’:No Such File 的错误怎么解决?

    手动添加cubeMX的软件自动生成代码编译出现’rtthread.elf’:No Such File 的错误。
    发表于 06-12 07:46

    【米尔-RK3562开发板试用评测】EtherCat移植、编译

    、内核编译篇把环境搭建好,要重新配置下内核,并进行单独的编译。 在单独
    发表于 05-28 14:49

    瑞萨RA单片机在e2 studio环境下printf编译出错的问题解析

    最近看到有些网友在讨论关于:瑞萨RA单片机在e2 studio环境下printf编译出错的问题。
    的头像 发表于 05-24 15:51 1746次阅读
    瑞萨RA单片机在e2 studio环境下printf<b class='flag-5'>编译出错</b>的问题解析

    Keil MDKIAR EWARM:通过工程迁移实现项目资产的更好管理

    对于需要统开发环境或涉及多核架构(如Cortex-A/R)的项目,越来越多的用户选择从Keil MDK迁移到IAR EWARM。这就会面临着需要将之前的
    的头像 发表于 05-08 09:03 1483次阅读
    从<b class='flag-5'>Keil</b> MDK<b class='flag-5'>到</b><b class='flag-5'>IAR</b> <b class='flag-5'>EWARM</b>:通过工程迁移实现项目资产的更好管理