C语言中的隐式声明是什么,有什么危害?warning: implicit declaration of function ‘xxx’ | 您所在的位置:网站首页 › 隐函数是什么 › C语言中的隐式声明是什么,有什么危害?warning: implicit declaration of function ‘xxx’ |
今天编译一个代码,提示CUSTOM_LAYER里面有一个C文件函数gettimeofday()隐式声明,用man手册查了一下,需要包含头文件#include 那么如果不包含会有什么后果呢?如果不包含,编译的时候就会去内建函数里去找,找得到,就报一个implicit declaration 的 warning,找不到,就报错 (注意,这里貌似每个编译器还不一样,gcc是内建函数优先,g++是自定义函数优先;就是说如果你自己定义了一个跟内建函数同名的函数,无论是否包含头文件,gcc都优先查找内建函数,g++优先查找自定义函数,至少我在ubuntu上测试是这样的。。。) 我们目前只考虑不包含头文件的情况 如果这个函数你没有重新实现,如果内建函数里有同名函数,你的函数刚好跟它们重名,它就不知道要找哪个; 如果这个函数是你重新实现过的,那么它就会到内建函数里找同名的函数,而不是你实现的那个函数,造成功能无法实现 所以: 为了避免这样的影响,强烈建议程序猿重视编译器给出的关于隐式声明的警告,及时通过包括必要的头文件来消除这样的警告 参考文章:万恶之源:C语言中的隐式函数声明 20220422 补充说明(ubuntu16.04上测试)如:int abs(int j)是stdlib.h的一个内建函数 测试1假如我们有个程序test.c: #include #include //函数abs需要引入的头文件 int main(){ printf("%d\n", abs(-1)); }编译运行都没问题: 测试2然后我们把#include 注释掉: #include //#include //函数abs需要引入的头文件 int main(){ printf("%d\n", abs(-1)); }编译的时候提示函数abs()隐式声明,运行没问题,结果正确 测试3 #include //#include //函数abs需要引入的头文件 int main(){ double ret = abs(-1); printf("%d\n", ret); } 测试4 #include //#include //函数abs需要引入的头文件 int abs(int a){ return a*a; } int main(){ int ret = abs(-2); printf("%d\n", ret); } |
CopyRight 2018-2019 实验室设备网 版权所有 |