• 解决“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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    其编译后提示的错误为:error: #147: declaration is incompatible withu16 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    #ifdef xxx
    //中间的必须是要定义的
    #endif 
    
    • 1
    • 2
    • 3

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

    u16 EN_ADDRESS;  
    
    • 1

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

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

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

  • 相关阅读:
    深入理解计算机网络-10传输层2
    Vue基础实例
    一文带你了解容器技术的前世今生
    通过驱动保护进程方案 (Window )
    软件开发项目文档系列之十五如何撰写项目结项报告
    利用aop+反射拦截mybatisplus的insert方法补充公共属性
    4.2uboot对设备树的支持——dtb的修改原理
    蒸散发与植被总初级生产力的区域数据下载、处理与显示
    彻底掌握Makefile(二)
    c++数据处理----图像修补:cv::inpaint()
  • 原文地址:https://blog.csdn.net/OMGMac/article/details/126550414