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

    文章

    1224

    浏览量

    171812
  • 变量
    +关注

    关注

    0

    文章

    615

    浏览量

    29369

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    开启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

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

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

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

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

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

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

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

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

    数据库数据恢复——MongoDB数据库文件拷贝服务无法启动的数据恢复

    数据库文件。MongoDB数据库文件拷贝到其他分区,对MongoDB数据库所在原分区进行了格式化操作。格式化完成数据库文件拷回原分区
    的头像 发表于 04-09 11:34 652次阅读
    数据库数据恢复——MongoDB数据库文件<b class='flag-5'>拷贝</b><b class='flag-5'>后</b>服务无法启动的数据恢复

    飞凌嵌入式ElfBoard ELF 1板卡-内核空间与用户空间的数据拷贝之数据拷贝介绍

    空间与用户空间之间的数据拷贝。copy_to_user()和copy_from_user()这两函数用于在内核空间和用户空间之间进行数据拷贝。copy_to_user()
    发表于 03-19 08:55

    瑞萨RA8快速上手指南:Cortex-M85内核瑞萨RA8开发环境搭建 并点亮LED

    因为Cortex-M内核,瑞萨RA8系列单片机支持多种市面上常见的开发环境,像Keil MDK、IAR EWARM等,而本文讲述的是瑞萨自家官方的IDE(e2 studio)。
    的头像 发表于 03-17 14:35 1564次阅读
    瑞萨RA8快速上手指南:Cortex-M85内核瑞萨RA8开发环境搭建 并点亮<b class='flag-5'>一</b><b class='flag-5'>个</b>LED

    如何项目从IAR迁移到Embedded Studio

    本文描述如何IAR EWARM项目迁移到SEGGER Embedded Studio(简称SES)中。
    的头像 发表于 02-25 17:11 1054次阅读
    如何<b class='flag-5'>将</b>项目从<b class='flag-5'>IAR</b>迁移到Embedded Studio

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之移植前的准备

    /interfaces重启网络服务:root@ELF1:~# /etc/rc5.d/S01networkingrestartping下开发环境的IP地址,保证能够ping通:此时编译出的内核
    发表于 01-22 10:43

    飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之移植前的准备

    /S01networkingrestart ping下开发环境的IP地址,保证能够ping通: 此时编译出的内核拷贝到开发板 elf@ubuntu:~/work
    发表于 01-21 14:30