前言
什么是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语言
+关注
关注
183文章
7642浏览量
144559 -
函数
+关注
关注
3文章
4406浏览量
66814 -
编译器
+关注
关注
1文章
1669浏览量
51070
发布评论请先 登录
SystemVerilog中的类构造函数new
隐式函数声明警告
为什么会出现函数对void函数声明隐式int警告?
隐式有符号到无符号转换
基于NTFS的最小侵入式隐写系统
隐函数、方程求根、不动点和迭代
Verilog HDL语言中任务与函数的比较
C++基础语法之inline 内联函数
C语言-函数的定义、声明、传参
鸿蒙Ability Kit(程序框架服务)【显式Want与隐式Want匹配规则】

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