解决“error #147 declaration is incompatible with xxx xxx (declared at line xx)”问题

本文介绍了一种在移植代码过程中遇到的预编译变量定义冲突问题,并给出了具体的解决方案。作者通过调整变量定义的位置,成功解决了编译错误和警告。

今天分享一个很奇怪的问题,为什么说奇怪,因为今天分享的这个错误是我在移植代码时候遇到的,在其他人的工程中可以正常运行,而我自己的就运行报错,于是来给大家分享一下,说不定有小伙伴知道呢~

错误问题

首先,我是在移植关于硬件IIC驱动EEPROM的工程时候,发现下面这部分代码在自己的工程里面会提示出错:

//file.h---start
#define EEPROM_ADDRESS_0 0xA0  
//flie.h----end


u16 EN_ADDRESS;
#ifdef EEPROM_ADDRESS_0
  /* 选择 EEPROM Block0 来写入 */
  EN_ADDRESS = EEPROM_ADDRESS_0;      
#endif

我看了一下好像没毛病,而且这代码在移植项目的那个工程里面是完全正常运行的,为什么移植到了我自己的工程就出错了。

其编译后提示的错误为:error: #147: declaration is incompatible with “u16 EN_ADDRESS” (declared at line 3) -----------------翻译过来是指不兼容的意思

并且还提示我了一个告警:warning: #77-D: this declaration has no storage class or type specifier
(警告:#77-D:此声明没有存储类或类型说明符)

于是我有查了一下网上,有些说把什么选项勾掉,有些说可能是宏多次定义,可能这些问题真的帮他忙解决了,但是却没有解决我的问题。

解决方法:

于是我自己在从提示问题上面和编译器改为定义的位置看,终于我从“警告:#77-D:此声明没有存储类或类型说明符”上面找到了一些源头,于是我想到把那个代码这样修改:

//file.h---start
#define EEPROM_ADDRESS_0 0xA0  
//flie.h----end

//u16 EN_ADDRESS;  /* 去掉这个定义 */
#ifdef EEPROM_ADDRESS_0
  /* 选择 EEPROM Block0 来写入 */
  u16 EN_ADDRESS = EEPROM_ADDRESS_0;     //直接在条件编译里面定义并赋值
#endif

然后修改后重新编译,发现竟然不报错和不告警了,奇怪了为什么在移植工程里面却可以那样,而我工程里面要这样。

因此,我想到可能是在预编译也就是条件编译的中间定义的变量是需要类型说明符的,也就是必须定义。

#ifdef xxx
//中间的必须是要定义的
#endif 

所以之前我前面加了这一句,导致了存在多次定义,也印证了那个告警提示:警告:#77-D:此声明没有存储类或类型说明符,现在这么一看是不是觉得这个告警很到点子上。

u16 EN_ADDRESS;  

因此,如果有其他小伙伴遇到我这样的情况,可以参考我的修改方式进行修改~

另外下次使用预编译时候如果里面用到了什么变量,还是要在里面定义比较好。

本人水平有限,上述信息仅供参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OMGMac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值