前言
什么是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
将警告设置为错误
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
相关推荐
在systemverilog中,如果一个类没有显式地声明构造函数(new()),那么编译仿真工具会自动提供一个隐
发表于 11-16 09:58
•3636次阅读
添加了Generated库文件,我能够成功构建。但是我得到了一个警告:隐式声明函数“Adter”。但是我在图书馆项目中声明了
发表于 05-28 12:24
#hello,JS:03-02 声明提前和立即执行函数
发表于 07-08 06:04
在我的项目中,我有41个输入输出引脚使用。在我的两个功能中,我喜欢函数读销和写别针。BuffTimple函数声明警告我不是添加PIN。h每增加一个奇数。我的函数H。任何其他解决方案请告
发表于 09-29 12:58
:warning:(361)函数声明为隐式int.,这似乎对代码的实际编译或运行没有任何影响,但是它有点烦人。有什么想法,为什么这个特定的功能是扔这个警告?
发表于 10-24 13:23
您好,我现在正在使用PIC16F18313,在代码中,我声明了一个变量,它位于我放入的示例代码中,问题是,我收到一个警告:隐式签名到无符号转换,我不知道是什么原因或者如何修复它。关于我的问题:希望你能得到一个很好的回答。谢谢。
发表于 04-07 14:06
为实现高效安全的信息存储,在分析访问权限控制与加密技术等数据保护措施及现有文件隐写系统的基础上,提出基于NTFS文件系统的最小侵入式隐写
发表于 03-31 10:30
•17次下载
隐函数、方程求根、不动点和迭代7.1知识要点与背景 7.1.1 隐函数存在定理与四连杆机构的运动 7.1.2 不动点和
发表于 10-17 00:35
•1864次阅读
基于隐式PIGPC的网络控制系统时延补偿方法_田中大
发表于 01-07 18:21
•0次下载
「1、什么是C语言的隐式函数声明」 在C语言中,函数在调用前不一定非要声明。如果没有
发表于 05-25 09:38
•3802次阅读
其中,返回值的类型和位宽是可选项,如果缺省会返回一位寄存器类型数据。Verilog HDL认为函数的定义隐式地声明了与函数同名的寄存器。
发表于 07-02 10:24
•2324次阅读
函数处; 相当于不用执行进入函数的步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 编译器一般不内联包含循环、递归、switch 等复杂操作的内联
发表于 09-09 09:38
•2145次阅读
C语言里函数是非常重要的知识点,一个完整的C语言程序就是由主函数和各个子函数组成的,主函数调用子函数完成各个逻辑功能。 这篇文章作为C语言
发表于 08-14 09:57
•1934次阅读
在实际开发中,Qt中很多类可以直接作为函数参数传递,这是为什么?其背后的实现机制又是什么?这些都归功于隐式共享
发表于 02-12 16:52
•788次阅读
在启动目标应用组件时,会通过显式[Want]或者隐式[Want]进行目标应用组件的匹配,这里说的匹配规则就是调用方传入的[want]参数中设置的参数如何与目标应用组件声明的配置文件进行
发表于 06-06 14:30
•509次阅读
评论