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

    文章

    1213

    浏览量

    166893
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28373

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

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

收藏 人收藏

    评论

    相关推荐

    分享keil MDK编译信息增强工具

    今天给大家分享 keil MDK 编译信息增强工具:keil-build-viewer. 1
    的头像 发表于 11-14 11:01 491次阅读

    在rt-thread bspesp32c3编译出的bin文件烧esp32的开发板上运行提示chipid不对,为什么?

    在rt-thread bspesp32c3编译出的bin文件烧esp32的开发板上 运行提示chipid不对,是否有方法修改能支持esp32 系列的开发板
    发表于 09-27 10:01

    ida反编译出来代码能直接用吗

    IDA反编译出来的代码通常 不能直接使用 ,这主要基于以下几个方面的原因: 、代码的不完整性 IDA反编译生成的代码可能缺少原始源代码中的某些关键信息。在编译过程中,
    的头像 发表于 09-02 10:55 674次阅读

    在eclipse的工程下创建另一个ide的工程时,执行make ewarm TOOLCAHIN=IAR出错怎么解决?

    当我想要在eclipse的工程下创建另一个ide的工程时,执行make ewarm TOOLCAHIN=IAR出错,报错信息如下: ~/mtw/FreeRTOS_Blinky>
    发表于 07-03 06:01

    ESP-IDF升级5.2.1编译出错的原因?

    大家好: 如题,IDF升级前编译没问题,升级报了下面的错误。这是哪里出错了?望指点!谢谢!
    发表于 06-05 07:18

    用eclipse生成eirkav3的代码拷贝到ads上编译,会报错怎么解决?

    用eclipse生成eirkav3的代码拷贝到ads上编译,会报错,解决烧写进TC397,发现程序可以运行,但是erikav3的内核没有启动,有谁遇到相同的问题了码?能否交流下?
    发表于 05-17 12:09

    请问STM8S如何中断代码拷贝到RAM中运行?

    STM8S在写EEPROM时,中断停掉,如何中断代码拷贝到RAM中运行??? 求助各位大神!!!
    发表于 05-17 07:37

    芯海通用 MCU应用笔记 :在 IAR 及 MDK 开发环境下使用 printf 函数重定向移植差异指南

    MCU 提供完整的工具链。因此,本应用笔记重点说明 IAR8.x 和 9.x 版本对 printf 函数的重定向的差异。并在本应用笔记结尾处给出可以键 移植
    发表于 05-16 11:56

    STM32 demko板生成KEIL工程编译出错是什么原因导致的?

    最近刚开始用STM32MotorControl Workbench 5.0.3STM32CubeMX4.25KEIL 生成工程编译总是出错出错总跟MCSDK_v5.0.3文件有关,不
    发表于 04-26 07:03

    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