解决”error #147″声明与xxx xxx不兼容的问题(在第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;
因此,如果有其他小伙伴遇到我这样的情况,可以参考我的修改方式进行修改~
另外下次使用预编译时候如果里面用到了什么变量,还是要在里面定义比较好。
本人水平有限,上述信息仅供参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~