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

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

3天内不再提示

隐式函数声明会导致系统怎么样?

汽车电子技术 来源:大橙子疯嵌入式 作者:大橙子疯 2023-02-15 15:02 次阅读

前言

什么是C语言的隐式函数声明。

在C语言中,函数在调用前不一定非要声明被调用的函数。如果没有声明的话,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。

如何踩坑的?

首先说明的是,在一份优先的源代码中,编译时通常是不会出现关于函数隐式声明的警告。

因为有着严格的编程规范,防止出现这种情况

请看下面的代码样例,有什么问题吗?

#include 

int main(void)
{
    int val = sqrt(4);

    printf("sqrt = %d", val);
}

在使用函数sqrt时没有包含头文件,在通过 IDE 软件编译链接时,通常会给出隐式函数声明的警告,很多初学者一般不怎么在意,只会在乎编译是否报错,因为只要能编译通过,程序就能正常运行。

然而,忽略隐式函数声明的警告程序就一定能正常运行吗?

根据隐式函数声明规则,编译器在编译时如果碰到这种问题,会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码,或者查找与隐式声明同名的函数。

如上述的代码示例中隐式声明的函数原型为:

int sqrt(int);

而对于的同名函数原型为:

double sqrt(double);

由于隐式函数声明,函数的返回值类型和参数类型均不一样,导致了错误的调用方式,在实际运行过程中极有可能出现错误。

特别是嵌入式软件开发,会接触很多系列的MCU平台,有着不一样的IDE软件可以开发,同样的代码,如果存在函数隐式声明的情况,在不同的IDE软件编译下,可能某一个编译下载后运行正常,而另一个IDE软件编译下载后却异常了,甚至出现跑飞的情况,那么一定要关注函数隐式声明的警告。


预防及解决措施

  • 首先可以从代码规范约束学起,调用某个模块的函数一定要包含对应的头文件,且头文件有该函数的声明。
  • 注意所有的警告,有些警告十分值得重视,尽量消除所有的警告
  • 在gcc编译时,可以增加编译选项-Werror=implicit-function-declaration将警告设置为错误
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7533

    浏览量

    128809
  • 函数
    +关注

    关注

    3

    文章

    3903

    浏览量

    61310
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48625
收藏 人收藏

    评论

    相关推荐

    为什么中断函数声明也可以

    用C写中断函数时,为什么不声明也可以用,以前我记得C语言老师说过在调用一个自定义函数以前要进行声明。 求解??
    发表于 11-26 00:08

    有关头文件写法或者函数声明调用的小技巧分享

    错,导致运行时代码无故死机、重启,有时跟函数声明、调用的有问题而编译器没有报错,本贴但愿能给出简单的建设性意见。一般文件声明、定义、调用的格式如下:应用场景介绍:a.C 文件、a.H文
    发表于 09-27 23:15

    光伏组件的裂和识别及预防

    线和细栅线收集和导出。因此,当裂(多为平行于主栅线的裂)导致细栅线断裂时,电流将无法被有效输送至主栅线,从而导致电池片部分乃至整片失效,还可能造成碎片、热斑等,同时引起组件的功率衰
    发表于 10-15 19:58

    签名到无符号警告

    您好,我很少关注签名到无符号转换警告。为什么所有的变量都被声明为无符号,我仍然得到这个警告?上面例子中的值是否被视为无符号或有符号字符?在这种情况下,变量“C”的值是150还是其他?同样,在下
    发表于 11-06 14:43

    .extern main声明main函数是必须的吗?

    韦老师的教程里第六课之前的汇编程序里都没有用.externmain声明main函数之后的程序又都开始用.externmain声明main函数这个声明
    发表于 04-17 07:45

    在MPLAB IDE中找不到函数声明

    添加了Generated库文件,我能够成功构建。但是我得到了一个警告:声明函数“Adter”。但是我在图书馆项目中声明
    发表于 05-28 12:24

    声明提前和函数声明前置

    #hello,JS:03-02 声明提前和立即执行函数
    发表于 07-08 06:04

    mysql转换具体描述

    mysql 转换问题
    发表于 08-13 06:07

    2D解析

    《Fundamentals of Computer Graphics》翻译(三):2D直线
    发表于 09-03 12:19

    函数声明警告

    在我的项目中,我有41个输入输出引脚使用。在我的两个功能中,我喜欢函数读销和写别针。BuffTimple函数声明警告我不是添加PIN。h每增加一个奇数。我的函数H。任何其他解决方案请告
    发表于 09-29 12:58

    为什么会出现函数对void函数声明int警告?

    :warning:(361)函数声明int.,这似乎对代码的实际编译或运行没有任何影响,但是它有点烦人。有什么想法,为什么这个特定的功能是扔这个警告?
    发表于 10-24 13:23

    有符号到无符号转换

    您好,我现在正在使用PIC16F18313,在代码中,我声明了一个变量,它位于我放入的示例代码中,问题是,我收到一个警告:签名到无符号转换,我不知道是什么原因或者如何修复它。关于我的问题:希望你能得到一个很好的回答。谢谢。
    发表于 04-07 14:06

    剖析什么是C语言中的隐式函数声明

    「1、什么是C语言的隐式函数声明」 在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式
    的头像 发表于 05-25 09:38 3324次阅读
    剖析什么是C语言中的隐式<b class='flag-5'>函数</b><b class='flag-5'>声明</b>

    C语言-函数的定义、声明、传参

    C语言里函数是非常重要的知识点,一个完整的C语言程序就是由主函数和各个子函数组成的,主函数调用子函数完成各个逻辑功能。 这篇文章作为C语言
    的头像 发表于 08-14 09:57 1630次阅读

    C语言内部函数与外部函数介绍

    一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。 在函数中出现的对变量的声明,除了用extern
    的头像 发表于 03-10 14:36 845次阅读