前言
什么是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写中断函数时,为什么不声明也可以用,以前我记得C语言老师说过在调用一个自定义函数以前要进行声明。 求解??
发表于 11-26 00:08
错,导致运行时代码无故死机、重启,有时跟函数声明、调用的有问题而编译器没有报错,本贴但愿能给出简单的建设性意见。一般文件声明、定义、调用的格式如下:应用场景介绍:a.C 文件、a.H文
发表于 09-27 23:15
线和细栅线收集和导出。因此,当隐裂(多为平行于主栅线的隐裂)导致细栅线断裂时,电流将无法被有效输送至主栅线,从而导致电池片部分乃至整片失效,还可能造成碎片、热斑等,同时引起组件的功率衰
发表于 10-15 19:58
您好,我很少关注隐式签名到无符号转换警告。为什么所有的变量都被声明为无符号,我仍然得到这个警告?上面例子中的值是否被视为无符号或有符号字符?在这种情况下,变量“C”的值是150还是其他?同样,在下
发表于 11-06 14:43
韦老师的教程里第六课之前的汇编程序里都没有用.externmain声明main函数之后的程序又都开始用.externmain声明main函数这个声明
发表于 04-17 07:45
添加了Generated库文件,我能够成功构建。但是我得到了一个警告:隐式声明函数“Adter”。但是我在图书馆项目中声明了
发表于 05-28 12:24
#hello,JS:03-02 声明提前和立即执行函数
发表于 07-08 06:04
mysql 隐式转换问题
发表于 08-13 06:07
《Fundamentals of Computer Graphics》翻译(三):隐式2D直线
发表于 09-03 12:19
在我的项目中,我有41个输入输出引脚使用。在我的两个功能中,我喜欢函数读销和写别针。BuffTimple函数声明警告我不是添加PIN。h每增加一个奇数。我的函数H。任何其他解决方案请告
发表于 09-29 12:58
:warning:(361)函数声明为隐式int.,这似乎对代码的实际编译或运行没有任何影响,但是它有点烦人。有什么想法,为什么这个特定的功能是扔这个警告?
发表于 10-24 13:23
您好,我现在正在使用PIC16F18313,在代码中,我声明了一个变量,它位于我放入的示例代码中,问题是,我收到一个警告:隐式签名到无符号转换,我不知道是什么原因或者如何修复它。关于我的问题:希望你能得到一个很好的回答。谢谢。
发表于 04-07 14:06
「1、什么是C语言的隐式函数声明」 在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式
发表于 05-25 09:38
•3324次阅读
C语言里函数是非常重要的知识点,一个完整的C语言程序就是由主函数和各个子函数组成的,主函数调用子函数完成各个逻辑功能。 这篇文章作为C语言
发表于 08-14 09:57
•1630次阅读
一般为了叙述方便,把建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。
在函数中出现的对变量的声明,除了用extern
发表于 03-10 14:36
•845次阅读
评论