keil5warning: function “xxxx” declared implicitly的bug分析

文章分析了在Keil5中遇到函数声明警告的原因,主要是由于头文件的预编译指令冲突,导致函数原型未被正确包含。作者举例说明了两个头文件都使用了相同的#ifndef__USART_H导致其中一个文件的内容未被编译器处理,从而引发错误。解决方案是确保每个头文件的防护宏unique,避免重复包含。此问题在移植代码时常见,特别是不同模块的串口配置部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

keil5warning: function “xxxx” declared implicitly的bug分析

一、问题分析:

可能是头文件出错,自己不小心将两个文件的预编译指令(防止头文件被重复包含)名称写成相同的了,

导致想要使用的函数原型声明的那个头文件由于另外一个头文件的预编译指令相同,而没有包含进来。

举个例子就明白了:

错误原因:

(1)我在移植语音模块的串口配置文件的时候忽略了去修改 #ifndef __USART_H,由于厂家命名为__USART_H,也就是说如果定义了 __USART_H就不会再次重新定义该头文件

在这里插入图片描述

(2)而之前,我移植指纹模块串口配置头文件的时候,厂家命名也为__USART_H ,与语音模块冲突,

导致我main.c都包含这两个文件的时候,有一个文件由于重复包含而不会被定义,导致使用该文件里面的函数时候,找不到函数原型而报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fVMx6TcV-1680422924733)(image-20230402154550694.png)]

(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.youkuaiyun.com/weixin_45714385/article/details/114965914

2.这种问题在移植程序的时候很容易出现,比如说我移植语音模块和指纹模块的串口配置部分的代码,厂家就会将头文件的预编译指令设置成一样的 #ifndef __USART_H 导致一种难以发现的错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值