__has_include 报错

news2024/11/18 20:46:58

作用:        

        在C或C++的预处理阶段,__has_include 是一个编译器特定的宏,主要用于检查编译器是否能够包含指定的头文件。这个宏在Clang和GCC(从某个版本开始)等编译器中可用,但在所有编译器中可能并不都支持。它主要用于条件编译,使得代码可以根据编译环境的不同包含不同的头文件或执行不同的代码路径。

#if __has_include("stm32h7xx.h")  
    #include "stm32h7xx.h"  
    // 可能还有针对STM32H7系列的特定配置或代码  
#elif __has_include("stm32f7xx.h")  
    #include "stm32f7xx.h"  
    // 可能还有针对STM32F7系列的特定配置或代码  
#elif __has_include("stm32l4xx.h")  
    #include "stm32l4xx.h"  
    // 可能还有针对STM32L4系列的特定配置或代码  
#else  
    #error "No supported STM32 series header file found."  
#endif

报错:

#if __has_include("stm32h7xx.h")
    /* CODE */
#endif

我使用的是IAR8.40.1版本,编译发现后出现以下两种错误: 

  • Error[Pe059]:function call is not allowed in a constant expression
  • Error[Pe031]"expression must have integral type

         如果你在使用 __has_include 时遇到了报错,这通常是因为你的编译器不支持这个特性,或者你的编译器版本太旧不支持。__has_include 是一个在较新版本的 Clang 和 GCC 中引入的特性,用于在预处理时检查是否可以包含某个头文件。

解决方案:

1.检查编译器类型和版本

        确保你正在使用的编译器是 Clang 或 GCC,并且版本足够新以支持 __has_include。对于 GCC,这个特性是在 GCC 5 中引入的,但对于完全的支持和稳定性,建议使用更新的版本。对于 Clang,大多数现代版本都支持这个特性。

2.更新编译器

        如果你的编译器版本太旧,尝试更新到最新版本,使用确保支持使用__has_include的编译器或编译器版本,通常更新编译器至可支持__has_include的版本后,向下兼容代码即可。

3.使用编译器特定的标志

        如果你使用的是支持 __has_include 的编译器,但出于某种原因它仍然报错,检查你的编译命令和标志是否可能以某种方式禁用了这个特性。

4.条件编译备选方案

        如果你的编译器不支持 __has_include,你可能需要寻找其他方式来条件编译你的代码。例如,你可以定义一些预处理器宏来手动指定包含哪个头文件,或者检查编译器的预定义宏来确定它支持哪个系列的 STM32 微控制器。

5.使用构建系统特性

        如果你使用的是 CMake 或其他构建系统,你可以利用这些系统提供的特性来检测编译器是否支持 __has_include,并相应地调整你的编译设置。

6.查看编译器文档和错误消息

        详细阅读编译器的文档和错误消息,看看是否有关于 __has_include 的特定信息或警告。

7.回退到旧式条件编译

        如果所有其他方法都失败了,你可能需要回退到更传统的条件编译方法,比如直接检查预定义的宏或编译器特定的特性。

示例:使用预定义的宏

        如果你正在为 STM32 微控制器编写代码,并且你的编译器不支持 __has_include,你可以考虑使用 STM32CubeMX 或其他工具来生成项目,这些工具通常会为你的目标微控制器设置正确的预定义宏。然后,你可以使用这些宏来条件编译你的代码:

#if defined(STM32H7)  
    #include "stm32h7xx.h"  
#elif defined(STM32F7)  
    #include "stm32f7xx.h"  
#elif defined(STM32L4)  
    #include "stm32l4xx.h"  
#else  
    #error "Unsupported STM32 series"  
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

气膜乒乓球馆的前景展望—轻空间

乒乓球作为我国的国球,在全球范围内始终保持领先地位,不仅是国民心中的重要运动,也在国际舞台上占据了举足轻重的地位。气膜乒乓球馆作为一种创新的体育设施,通过结合先进的气膜技术与传统乒乓球运动,为爱好者提供了一…

Heart Animated 写实心脏模型素材带动画医学

心脏动画: 解剖细节逼真的心脏。 此资源包含高质量着色全色HD中的所有纹理,并使用HD中的凹凸贴图(NORMALMASP)。所有Prefab Ready均适用于游戏、应用程序和VR应用程序。预制件已准备好位置和旋转0,0,0。拖动到场景时。 还具有完整的心动周期。 Tris=约81 k。 顶点=约51 k …

关于如何使用终端查看类的布局教程

在继承章节我们使用了vs提供的终端查看类之间的继承模型,在后续多态的学习过程中,我们也将继续使用该方法去查看虚表等信息。 第一步:打开VS提供的终端窗口: 第二步:获取需要查看的类所在的源文件的地址: …

TypeScript 设计模式之【迭代器模式】

文章目录 迭代器模式:优雅遍历集合的智能书签迭代器模式的奥秘迭代器模式有什么利与弊?如何使用迭代器模式来优化你的数据遍历代码实现案例迭代器模式的主要优点迭代器模式的主要缺点迭代器模式的适用场景总结 迭代器模式:优雅遍历集合的智能书签 你是…

运维工具之adb命令安装和使用

一、adb命令简介 ADB(Android Debug Bridge)是 Android 开发者工具包中的一个命令行工具,主要用于在开发、调试和测试 Android 应用时与 Android 设备进行交互。通过 ADB 工具,开发者和用户可以从电脑对 Android 设备执行各种操作…

md编辑器语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【递归】5.leetcode 872 叶子相似的树

1 题目描述 题目链接:叶子相似的树 2 解答思路 递归分为三步,接下来就按照这三步来思考问题 第一步:挖掘出相同的子问题 (关系到具体函数头的设计) 第二步:只关心具体子问题做了什么 (关…

Swoole的多进程模块

Swoole是有自己的一个进程管理模块,用来替代PHP的pcntl扩展,需要注意Process进程在系统是非常昂贵的资源,创建进程消耗很大,另外创建的进程过多会导致进程切换开销大幅上升。 为什么不使用pcntl 1.pcntl没有提供进程间通信的功能…

AI智能眼镜_带摄像头的AI智能眼镜,AI大模型落地的载体

随着科技的迅猛发展,AI智能眼镜汇聚了众多硬件的优势,成为现代生活中不可或缺的一部分。这种创新设备不仅内嵌了耳机、摄像头以及WiFi和蓝牙模块等核心硬件,还具备了音频播放、图像拍摄和无线通信等多种功能,极大地提升了信息获取…

深度学习经典模型之BERT(上)

深度学习经典模型之BERT(下) BERT(Bidirectional Encoder Representations from Transformers)是一个双向transformer编码器的言表示模型。来自论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 。由Google公司的…

【WRF运行第二期(Ubuntu)】ARWpost安装及错误总结

WRF运行第二期:ARWpost安装及错误总结 1 ARWpost介绍2 ARWpost安装2.1 ARWpost_V3安装前准备2.2 安装ARWpost2.3 修改Makefile文件2.4 修改configure.arwp文件2.5 生成可执行文件EXE另:报错1-Error: Type mismatch between actual argument at (1) and a…

计算物理精解【3】- FORTRAN计算

文章目录 概述hello,world环境接收输入与输出 读取csv文件if and select case循环formatread,write formatread,write读写文件录入与读取数据文件定位csv 数组一维数组最小二乘法下标隐式循环 关系代数基本运算笛卡尔积投影选择 过程参数select case 和 过程module快排函数自定…

深度学习自编码器 - 分布式表示篇

序言 深度学习作为人工智能领域的重要分支,其核心在于表示学习( Representation Learning \text{Representation Learning} Representation Learning),尤其是分布式表示( Distributed Representation \text{Distribut…

【JUC并发编程系列】深入理解Java并发机制:高效并发背后的守护者(八、线程池的秘密)

文章目录 【JUC并发编程系列】深入理解Java并发机制:高效并发背后的守护者(八、线程池的秘密)1. 线程池基础知识1.1 什么是线程池1.2 为什么要使用线程池1.3 线程池使用场景1.4 线程池有哪些作用 2. 线程池基本用法2.1 线程池的创建方式2.2 线程池底层是如何实现复用…

前端vuex

需要共享的数据适合存储到vuex中 state基本使用 如果开启strict严格模式,直接修改上图的age会报错提示。不能在组件中直接修改state

“永辉优品”会是中国零售的答案吗?

投资者这么快就“看懂”名创优品的豪赌了? 9月25日,永辉超市继续一字涨停,而令人意外的是,名创优品也反弹近8%。 随着名创优品于9月23日晚间在港交所公告,以62.7亿人民币收购永辉超市29.4%的股权,两家公司…

数据科学的核心工具箱:全面解析pandas、matplotlib.pyplot与scipy.stats在复杂数据分析流程中的应用

在当今数据驱动的世界中,Python已成为数据分析和科学计算的首选语言。 而 pandas 、 matplotlib.pyplot 和 scipy.stats 这三个库则是数据科学家和分析师武器库中 的三把利剑。 1. pandas 数据处理的瑞士军刀 pandas 库是 Python数据分析 的基石,它…

Distilabel合成数据生成框架简明教程

Distilabel 是一个用于合成数据和 AI 反馈的框架,适用于需要基于经过验证的研究论文的快速、可靠和可扩展的管道的工程师。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 -…

SpringCloud~

帮你轻松入门SpringCloud~ 1 微服务概述 1.1什么是微服务 如idea中使用maven建立的一个个moudle,它具体是使用SpringBoot开发的一个小模块,专业的事交给专业的模块来做,每个模块完成一个具体的任务或功能。 1.2 什么是微服务架构 它将单一应用…

MyBatis 动态 SQL 使用指南

MyBatis 是一个流行的持久层框架,它通过 XML 或注解将接口方法与 SQL 映射在一起。动态 SQL 是 MyBatis 的一大特性,它使得构建灵活的查询变得简单。本文将通过一个 User 表的示例,介绍 MyBatis 中常用的动态 SQL 方法。 1. 什么是动态 SQL&…