前言什么是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将警告设置为错误
为什么中国专注于机器人技术?
绘出「星辰大海」:华为云 Astro 轻应用新手指南Ⅱ
小米6最新消息:小米6能否帮雷军一场漂亮的翻身仗?
电感元件的应用范围都有哪些
iPhone“降速门”后 更换电池需求爆发
隐式函数声明会导致系统怎么样?
物联网为何成为了黑客的目标
SIMATIC S7-1500 PLC之间的OUC通信
基于模块HTTP测试流程
小米9Pro5G开启预约 于9月27日正式发售
一加7T系列正式发布 售价2999元起
激光焊接技术焊接0.6mm黄铜时需要注意哪些事项
意法半导体携行业领先解决方案亮相慕尼黑电子展
【MPS工程师笔记】非隔离型变换器电磁干扰(EMI)的分析与建模方法
JDL京东物流智能快递车—小红马 L4级自动驾驶技术
首款免费导购平台花生日记诞生,5月开启分享赚功能!
九大颠覆电路设计的科幻技术,芯片可观察癌细胞
索尼将推出一款名为Xperia4的中端新机 屏幕尺寸约为5.7英寸单手即可掌控
消息称比亚迪将于2022年推出新能源高端品牌
超威电池质量过硬用事实说话,是品质更是责任