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

    文章

    7604

    浏览量

    136683
  • 函数
    +关注

    关注

    3

    文章

    4327

    浏览量

    62569
  • 编译器
    +关注

    关注

    1

    文章

    1623

    浏览量

    49108
收藏 人收藏

    评论

    相关推荐

    SystemVerilog中的类构造函数new

    在systemverilog中,如果一个类没有显声明构造函数(new()),那么编译仿真工具自动提供一个
    发表于 11-16 09:58 3636次阅读

    在MPLAB IDE中找不到函数声明

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

    声明提前和函数声明前置

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

    函数声明警告

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

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

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

    有符号到无符号转换

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

    基于NTFS的最小侵入系统

    为实现高效安全的信息存储,在分析访问权限控制与加密技术等数据保护措施及现有文件系统的基础上,提出基于NTFS文件系统的最小侵入
    发表于 03-31 10:30 17次下载

    函数、方程求根、不动点和迭代

    函数、方程求根、不动点和迭代7.1知识要点与背景  7.1.1   函数存在定理与四连杆机构的运动  7.1.2  不动点和
    发表于 10-17 00:35 1864次阅读

    基于PIGPC的网络控制系统时延补偿方法

    基于PIGPC的网络控制系统时延补偿方法_田中大
    发表于 01-07 18:21 0次下载

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

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

    Verilog HDL语言中任务与函数的比较

    其中,返回值的类型和位宽是可选项,如果缺省会返回一位寄存器类型数据。Verilog HDL认为函数的定义声明了与函数同名的寄存器。
    的头像 发表于 07-02 10:24 2324次阅读

    C++基础语法之inline 内联函数

    函数处; 相当于不用执行进入函数的步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般不内联包含循环、递归、switch 等复杂操作的内联
    的头像 发表于 09-09 09:38 2145次阅读

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

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

    基于Qt 5.15源码来聊聊共享

    在实际开发中,Qt中很多类可以直接作为函数参数传递,这是为什么?其背后的实现机制又是什么?这些都归功于共享
    的头像 发表于 02-12 16:52 788次阅读

    鸿蒙Ability Kit(程序框架服务)【显Want与Want匹配规则】

    在启动目标应用组件时,会通过显[Want]或者[Want]进行目标应用组件的匹配,这里说的匹配规则就是调用方传入的[want]参数中设置的参数如何与目标应用组件声明的配置文件进行
    的头像 发表于 06-06 14:30 509次阅读
    鸿蒙Ability Kit(程序框架服务)【显<b class='flag-5'>式</b>Want与<b class='flag-5'>隐</b><b class='flag-5'>式</b>Want匹配规则】