C语言中的隐式声明是什么,有什么危害?warning: implicit declaration of function ‘xxx’ 您所在的位置:网站首页 隐函数是什么 C语言中的隐式声明是什么,有什么危害?warning: implicit declaration of function ‘xxx’

C语言中的隐式声明是什么,有什么危害?warning: implicit declaration of function ‘xxx’

2024-06-13 19:14| 来源: 网络整理| 查看: 265

今天编译一个代码,提示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 实验室设备网 版权所有