keil5warning: function “xxxx” declared implicitly的bug分析
一、问题分析:
可能是头文件出错,自己不小心将两个文件的预编译指令(防止头文件被重复包含)名称写成相同的了,
导致想要使用的函数原型声明的那个头文件由于另外一个头文件的预编译指令相同,而没有包含进来。
举个例子就明白了:
错误原因:
(1)我在移植语音模块的串口配置文件的时候忽略了去修改 #ifndef __USART_H
,由于厂家命名为__USART_H
,也就是说如果定义了 __USART_H
就不会再次重新定义该头文件
(2)而之前,我移植指纹模块串口配置头文件的时候,厂家命名也为__USART_H ,与语音模块冲突,
导致我main.c
都包含这两个文件的时候,有一个文件由于重复包含而不会被定义,导致使用该文件里面的函数时候,找不到函数原型而报错
(3)导致我main.c
都包含这两个文件的时候,有一个文件由于重复包含而不会被定义,导致使用该文件里面的函数时候,找不到函数原型而报错
分析:
(1)由于先包含usart3.h,usart3.h中的内容在编译阶段拷贝过来,即编译器执行了 #define__USART_H
的语句,
(2)但是后面的预编译指令 #include "usart5.h"
执行的时候,由于与usart3.h中的命名相同(移植的时候忽略的一个小细节),导致编译器认为 __USART_H
已经定义好了(因为usart3.h中有#define__USART_H
语句),
(3)所以usart5.h文件中的#ifndef __USART_H
#define__USART_H
的语句,会使得由于usart3.h中已经定义了__USART_H而导致该文件不会被定义,也就是该文件里面的所有内容包括函数声明不会拷贝过来
(4)所以导致使用该文件声明的函数的时候会出现declared implicitly这种错误
二、总结:
1.这里给大家提供的是一种解决该问题的思路,并不一定就是这个原因。其他方法可以参考以下其他博主的总结的方法
https://blog.csdn.net/weixin_45714385/article/details/114965914文章来源:https://www.toymoban.com/news/detail-760313.html
2.这种问题在移植程序的时候很容易出现,比如说我移植语音模块和指纹模块的串口配置部分的代码,厂家就会将头文件的预编译指令设置成一样的 #ifndef __USART_H
导致一种难以发现的错误文章来源地址https://www.toymoban.com/news/detail-760313.html
到了这里,关于keil5warning: function “xxxx” declared implicitly的bug分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!