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

这篇具有很好参考价值的文章主要介绍了解决“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;  

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

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

本人水平有限,上述信息仅供参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~文章来源地址https://www.toymoban.com/news/detail-785191.html

到了这里,关于解决“error #147 declaration is incompatible with xxx xxx (declared at line xx)”问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译错误 error: implicit declaration of function ‘getopt’ [-Werror=implicit-function-declaration] 解决方法

    编译错误: error: implicit declaration of function ‘getopt’ [-Werror=implicit-function-declaration] 在某些C标准中,要求函数必须在调用前具有显示声明,例: 若在调用前没有显示声明,则报编译错误,例: 使用 getopt 方法时,需要先 #include utistd.h , utistd.h 中又进行了 #includegetopt.h 的包含

    2024年02月16日
    浏览(80)
  • VUE报错解决Could not find a declaration file for module ‘xxx‘.

    Github上下载的代码,导入后出现以下报错。    错误代码 Could not find a declaration file for module \\\'element-plus/dist/locale/zh-cn.mjs\\\'. \\\'c:/Users/Lenovo/typescript/hotel/hotel-system-web-main/node_modules/element-plus/dist/locale/zh-cn.mjs\\\' implicitly has an \\\'any\\\' type. If the \\\'element-plus\\\' package actually exposes this module, try ad

    2024年02月12日
    浏览(47)
  • vscode:配置@路径提示,并解决Cannot find module ‘@/utils/xxx‘ or its corresponding type declarations.

    在使用 vue3 + ts 的时候,使用 alias 配置了 @ 路径 vite.config.js 这时候发现填写路径的时候没有代码提示 下载插件 Path Intellisense 或者 Path Autocomplete 这里我们以第一个为例 效果: 有几个点要注意一下: 1、确保你引入的文件是 ts 文件而不是 js 文件 2、 command + shift + P ,输入 ty

    2024年02月13日
    浏览(48)
  • error @achrinza/node-ipc@9.2.5: The engine “node“ is incompatible with this module. 解决node.js版本不兼容问题

    目录 很多人运行项目的时候会出现报错信息: 解决方案 然后再次运行就好了: 此时,我点击链接就可以看到了: 很多人运行项目的时候会出现 报错信息: 这个错误是因为你的项目中使用了一个模块 @achrinza/node-ipc,它要求 Node.js 版本在 8 到 18 之间,但你的 Node.js 版本是

    2024年03月27日
    浏览(61)
  • error: #268: declaration may not appear after executable statement in block问题解决方法

    在stm32f407编程中遇到了error: #268: declaration may not appear after executable statement in block,编写代码如下: 报错情况: 问题分析: 在c89(1989年)标准中规定了c文件中局部变量的定义只能放在所有执行语句前,放在开头处;c99(1999年)标准中c文件中局部变量的定义可以放在任何地方

    2024年02月13日
    浏览(45)
  • OpenCV4 报错error:‘ CV_* ’was not declared in this scope 解决方法汇总

    最近用opencv4.5.2配vins,总是报错,每次都要改一大堆,在此总结 在头文件中添加 #include opencv2/imgproc/imgproc_c.h 在头文件中添加 #include opencv2/calib3d/calib3d_c.h 在头文件中添加 #include opencv2/imgproc/types_c.h,或者改成cv::COLOR_GRAY2BGR 依次改为 cv::THRESH_BINARY_INV cv::CHAIN_APPROX_SIMPLE cv::RETR

    2024年02月09日
    浏览(53)
  • 关于Failed to declare queue(s):[xxx]报错问题

    1、在测试rabbit的时候报Failed to declare queue(s) 声明队列失败 2、进入mq查看是否有这个队列,发现并没有这个队列,需要创建队列 3、创建方式一:Add a new queue 4、创建方式二:用代码自动创建,增加以下配置类

    2024年02月14日
    浏览(41)
  • 使用RabbitMQ时:Failed to declare queue(s):[XXX]

    一些遇到的错误,小总结 问题描述 Failed to declare queue(s):[XXX] 在SpringBoot中使用RabbitMQ时,遇到了如题目所示的错误 即,队列创建失败。 方案总结 首先,在RabbitMQ的管理页面中,检查看看有没有要用的队列。 如果有要用的 看看名字是否对的上,就 提示创建失败的队列和要用的

    2024年02月15日
    浏览(65)
  • warning: implicit declaration of function ‘gets‘ is invalid in C99 [-Wimplicit-function-declaration]

    一、告警类型:warning: implicit declaration of function \\\'gets\\\' is invalid in C99 [-Wimplicit-function-declaration] warning: the `gets\\\' function is dangerous and should not be used. 函数“gets”的隐式声明在C99中无效 二、告警原因: 参考文献:产生告警的原因参考连接 1.因为 get 不是 c99 标准的一部分,不应该使

    2023年04月24日
    浏览(40)
  • Android studio的报错提示:AAPT: error: ‘‘ is incompatible with attribute background (attr) reference|color

    Android studio的报错提示: 解决问题,看如下图: 其他学习资料: 1、付费专栏《Android kotlin入门到进阶系列讲解》:https://blog.csdn.net/qq_35091074/category_11036895.html 2、免费专栏《Android kotlin开源项目-功能》(可提供源码):https://blog.csdn.net/qq_35091074/category_12005202.html

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包