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
    +关注

    关注

    68

    文章

    1196

    浏览量

    165284
  • 变量
    +关注

    关注

    0

    文章

    595

    浏览量

    28111

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

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

收藏 人收藏

    评论

    相关推荐

    CubeMX生成的TrueStudio工程,TrueStudioV9.3编译出错怎么解决?

    CubeMX生成的TrueStudio工程,TrueStudioV9.3编译出错
    发表于 04-22 08:28

    ST Visual Develop + cxstm8_32k编译出错怎么解决?

    次用 ST Visual Develop + cxstm8_32k 之间都是用IAR。 ST Visual Develop + cxstm8_32k 编译出错: Error creating process for executable size 这个问题 应该怎
    发表于 04-17 07:08

    CubeMX生成的TrueStudio工程,TrueStudioV9.3编译出错是什么原因导致的?

    CubeMX生成的TrueStudio工程,TrueStudioV9.3编译出错
    发表于 04-16 06:48

    ModusToolbox™ 工程转iar工程报错的原因?怎么解决?

    我的 make ewarm TOOLCHAIN 档案模组工具箱工程转到成为 IAR 工程师的路程中使用 make ewarm TOOLCHAIN =
    发表于 02-29 06:30

    HighTec工程编译出错,已经添加了路径,但还出错是怎么回事?

    HighTec工程编译出错,已经添加了路径,但还出错!#include \"Tricore/Compilers/Compilers.h\" /* mapping compiler
    发表于 02-04 06:34

    AURIX TC387代码拷贝到DSPR和PSPR中执行的区别?

    1. 代码拷贝到DSPR和PSPR中执行的区别? 2. DSPR有什么安全机制可以保护拷贝的代码不会被篡改?
    发表于 02-02 06:58

    IAR EWARM全新升级、SEGGER推出免费商用Embedded Studio

    最近,IAR EWARM进行了全新的升级,版本升级到了V9.50.1。
    的头像 发表于 12-13 09:11 623次阅读
    <b class='flag-5'>IAR</b> <b class='flag-5'>EWARM</b>全新升级、SEGGER推出免费商用Embedded Studio

    BF592 RAM超出就编译出错,请问是什么原因引起?

    只能为16252 BYTE,如果超出就编译出错,请问是什么原因引起?我应该怎么样才能用到32K的空间?我这样的定义语法应该是存在内部32K的SRAM没错吧?谢谢!
    发表于 11-30 07:10

    STM32通过命令行编译和下载keilIAR工程的方法

    STM32通过命令行编译和下载keilIAR工程的方法
    的头像 发表于 10-31 17:01 963次阅读
    STM32通过命令行<b class='flag-5'>编译</b>和下载<b class='flag-5'>keil</b>和<b class='flag-5'>IAR</b>工程的方法

    如何在Keil中将函数或变量编译指定地址

    如何在Keil中将函数或变量编译指定地址在Keil 中将函数或变量
    发表于 10-19 06:51

    IAR下如何程序拷贝在RAM中运行

    有时候我们需要将部分程序从 FLASH 拷贝到 RAM 中运行,以提高程序运行的速度。本文基于 IAREmbedded Workbench 列出了些方法,可以在系统启动时自动从 FLASH 中将
    发表于 09-28 06:50

    IAR的工程怎么移植keil

    IAR的工程怎么移植keil
    发表于 09-21 07:48

    IAR支持中文了,keil还会远吗?

    相信最近有访问 IAR 官网的小伙伴已经看到了,其实,我最早发现 IAR 支持中文,是在前段时间下载 IAR EWARM V9.40 的时候。
    的头像 发表于 07-04 09:26 1248次阅读
    <b class='flag-5'>IAR</b>支持中文了,<b class='flag-5'>keil</b>还会远吗?

    KEIL C51下编译出的HEX文件上电直复位的原因?

    以前KEIL3下的老的工程,在KEIL C51下编译出的HEX文件与之前完全不同,上电
    发表于 06-27 07:05

    N3290X在运行时可否直接SPI flash中画面数据拷贝到内部sdram中 ?

    我咨询下 用N3290X 只在外围挂颗SPI flash (比如16M)可以画面 在下载时 直接下载到SPI flash 中(比如通过串口)还是需要先通过下载器画面下载到SPI flash 中?在运行时 可否直接
    发表于 06-27 06:30