C++20中的Feature Test Mocros

      C++20定义了一组预处理器宏,用于测试各种语言和库的feature。

      Feature Test Mocros(特性测试宏)是C++20中引入的一种强大机制,用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现,它使你能够在编译过程中仔细检查特定语言或库功能(particular language or library feature)是否获得编译器的支持。这种方式提供了一种查询编译器功能的统一方法,从而有助于无缝调整代码库。通过战略性地使用Feature Test Mocros,开发人员能够识别所选功能(feature)的可用性。因此,这允许根据特定属性的存在与否来有条件地组装代码段。总体结果是在一系列编译器和C++标准的不同版本中保留代码功能

      C++20引入了一套以_cpp为前缀的预定义宏。利用这些宏作为工具来评估所需功能的存在。将取决于特定功能的代码段封装在#ifdef和#endif预处理器指令中。定义宏时,相应的代码块将在编译过程中集成;相反,如果宏仍未定义,则编译时会省略该块

      (1).language features:宏是在每个翻译单元(translation unit)中预定义的。当工作草案(working draft)中包含了相应的feature时,每个宏都扩展为一个与年份和月份相对应的整数字面值。当一个feature发生重大变化时,宏将相应地更新。

      (2).library features:如果包含头文件<version>或对应的头文件例如<any>,则会定义对应宏。当工作草案(working draft)中包含了相应的feature时,每个宏都扩展为一个与年份和月份相对应的整数字面值。当一个feature发生重大变化时,宏将相应地更新。

      头文件<version>

      (1).此头文件是language support library的一部分。此头文件提供有关标准库的实现相关信息(例如特定于实现的库版本宏)。

      (2).定义了很多library feature-test macros,在实现该feature时扩展为一个数字。这个数字表示该feature被添加到C++标准中的年份和月份。

      支持的宏列表:https://en.cppreference.com/w/cpp/feature_test 

      以下为测试代码:

int test_feature_test_macros()
{
	// language features
#ifdef __cpp_constexpr
	std::cout << "support constexpr" << std::endl;
#else
	std::cout << "Warning: unsupport constexpr" << std::endl;
#endif

#ifdef __cpp_structured_bindings
	std::cout << "support structured bindings" << std::endl;
#else
	std::cout << "Warning: unsupport structured bingdings" << std::endl;
#endif

#ifdef __cpp_consteval
	std::cout << "support consteval" << std::endl;
#else
	std::cout << "Warning: unsupport consteval" << std::endl;
#endif

#ifdef __cpp_aggregate_paren_init
	std::cout << "support aggregate paren init" << std::endl;
#else
	std::cout << "Warning: unsupport aggregate paren init" << std::endl;
#endif

	// library features
#ifdef __cpp_lib_ranges
	std::cout << "ranges library available" << std::endl;
#else
	std::cout << "Warning: ranges library unavailable" << std::endl;
#endif

#ifdef __cpp_lib_filesystem
	std::cout << "filesystem library available" << std::endl;
#else
	std::cout << "Warning: filesystme library unavailable" << std::endl;
#endif

#ifdef __cpp_lib_any
	std::cout << "any library available" << std::endl;
#else
	std::cout << "Warning: any library unavailable" << std::endl;
#endif

#ifdef __cpp_lib_fbc
	std::cout << "fbc library available" << std::endl;
#else
	std::cout << "Warning: fbc library unavailable" << std::endl;
#endif

	return 0;
}

      执行结果如下图所示:选择不同的C++语言标准(C++14/C++17/C++20),输出结果不同

      GitHub:https://github.com/fengbingchun/Messy_Test

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python输入、输出和变量

一、变量 变量是存储数据的容器。在 Python 中&#xff0c;变量在使用前不需要声明数据类型&#xff0c;Python 会根据赋值自动推断变量类型。 定义变量&#xff1a; 二、输入&#xff08;Input&#xff09; input() 函数用于获取用户输入。默认情况下&#xff0c;input() 会…

系统因果性

1、因果系统的定义   若系统当前输出仅由系统当前或过去的输入决定&#xff0c;则称该系统为因果系统。由于因果系统是物理课实现的&#xff0c;且具有稳定性和可预测性&#xff0c;所以得到广泛应用。设系统输入、输出分别为 x ( t ) x(t) x(t)&#xff0c; y ( t ) y(t) y(t…

描述React Hooks中的useMemo和useCallback的区别和用途。

React Hooks API中的useMemo和useCallback都是用于优化性能的钩子&#xff0c;但它们的用途和工作方式略有不同&#xff1a; 推荐大家看看我过往的文章 useMemo useMemo是一个性能优化钩子&#xff0c;它返回一个记忆化的值。useMemo可以避免在组件渲染时进行昂贵的计算或操作…

【html】用html+css模拟Windows右击菜单

效果图&#xff1a; 在这个示例中&#xff0c;我为每个.second-list添加了一个.sub-menu的<div>&#xff0c;它包含了子菜单项。当鼠标悬停在.second-list上时&#xff0c;.sub-menu会显示出来。你可以根据需要调整这个示例以适应你的具体需求。 记住&#xff0c;这只是…

SpringMVC系列六: 视图和视图解析器

视图和视图解析器 &#x1f49e;基本介绍&#x1f49e; 自定义视图为什么需要自定义视图自定义试图实例-代码实现自定义视图工作流程小结Debug源码默认视图解析器执行流程多个视图解析器执行流程 &#x1f49e;目标方法直接指定转发或重定向使用实例指定请求转发流程-Debug源码…

谁说串口通信波特率越高越好?

在电子世界里&#xff0c;串口通信就像是电子设备之间的“悄悄话”&#xff0c;它们通过串行数据传输来交换信息。但你知道吗&#xff1f;串口通信的波特率并不是越高越好&#xff0c;这事儿得好好聊聊。 1.什么是串口通信&#xff1f; 串口通信&#xff0c;就像它的名字一样&a…

cherry 笔记三(启动)

cherry启动很简单 app创建完 直接startup()就好了 func main() {app : cherry.Configure("./examples/config/profile-chat.json","chat-master",false,cherry.Cluster,)app.SetSerializer(cserializer.NewJSON())app.Startup() } Configure()--->N…

【Python机器学习】NMF——将NMF应用于人脸图像

将NMF应用于之前用过的Wild数据集中的Labeled Faces。NMF的主要参数是我们想要提取的分量个数。通常来说&#xff0c;这个数字要小于输入特征的个数&#xff08;否则的话&#xff0c;将每个像素作为单独的分量就可以对数据进行解释&#xff09;。 首先&#xff0c;观察分类个数…

汽车销售系统

摘 要 在现代社会&#xff0c;电脑是企业运作和管理必不可少的工具。我们过去用手记下卖出的商品的年代已一去不复返了。在我国&#xff0c;汽车销售行业的竞争日趋激烈的情况下&#xff0c;如何提高企业的管理水平&#xff0c;提高企业的工作效率&#xff0c;提高企业的服务质…

ARC学习(3)基本编程模型认识(三)

笔者来介绍arc的编程模型的中断流程和异常流程 1、中断介绍 主要介绍一下中断进入的流程&#xff0c;包括需要配置的寄存器等信息。 中断号&#xff1a;16-255&#xff0c;总共240个中断。触发类型&#xff1a;脉冲或者电平触发中断优先级&#xff1a;16个&#xff0c;0最大&…

DAC测试实验——FPGA学习笔记7

一、DAC简介 DAC全称Digital to Analog Converter&#xff0c;即数模转换器。它用于将主控芯片产生的数字值(0和1)转换为模拟值(电压值)。 1、DAC参数指标 2、DAC类型 常用的DAC可大致分为权电阻网络DAC、T型电阻网络DAC、倒T型电阻网络DAC以及权电流型DAC。 3、AD9708/3PD9…

RSA 加密算法的基础数论、基本原理与 Python 实现 (包含扩展欧几里得算法)

Title: RSA 加密算法的基础数论、基本原理与 Python 实现&#xff08;包含扩展欧几里得算法&#xff09; 文章目录 前言I. 数学原理1. 整数环2. 单位元3. 欧拉定理 II. 算法原理1. 扩展欧几里得算法2. RSA 非对称加密算法 III. 算法实现1. 源代码2. 测试结果 总结参考文献 前言…

spdlog生产者消费者模式

spdlog生产者消费者模式 spdlog提供了异步模式&#xff0c;显示的创建async_logger, 配合环形队列实现的消息队列和线程池实现了异步模式。异步logger提交日志信息和自身指针&#xff0c; 任务线程从消息队列中取出消息后执行对应的sink和flush动作。 1. 环形队列 1.1 环形队…

智慧校园综合门户有哪些特点?

智慧校园的门户系统&#xff0c;作为整个智慧校园架构的门户窗口&#xff0c;扮演着至关重要的角色。它如同一座桥梁&#xff0c;将校园内的各种信息资源、应用服务以及管理功能紧密相连&#xff0c;为师生、家长及管理人员提供了一个集中访问的便捷通道。智慧校园门户的设计理…

RPC通信原理以及项目的技术选型

目录 1.引言 2、RPC通信原理 3.图示解析 4.再举个例子 1.引言 根据上一篇博客《单机&#xff0c;集群和分布式》的举的例子。 我们最终合理地通过对大型软件的合理划分&#xff0c;划分成不同模块&#xff0c;按需求&#xff08;硬件需求&#xff0c;高并发需求&#xff09…

Hadoop+Spark大数据技术(微课版)总复习

期末试卷组成 一、选择题(每小题2分&#xff0c;共20分) 二、判断题(每小题2分&#xff0c;共20分) 三、简答题(每小题5分&#xff0c;共20分) 四、程序分析题 (第1-5小题各6分&#xff0c;第6题10分&#xff0c;共40分) 图1 Hadoop开发环境 图2 HDFS 图3 MapReduce 图4 H…

IDEA插件推荐-CodeGeex

功能&#xff1a;这个插件可以实现快速翻译代码&#xff0c;json文件格式转换&#xff0c;代码语言类型转换。 安装方式&#xff1a;File->Settings->Plugins->MarketPlace->搜索“CodeGeex”即可 &#xff08;CodeGeex功能展示&#xff09; &#xff08;CodeGeex…

【科普】半导体制造过程的步骤、技术、流程

在这篇文章中&#xff0c;我们将学习基本的半导体制造过程。为了将晶圆转化为半导体芯片&#xff0c;它需要经历一系列复杂的制造过程&#xff0c;包括氧化、光刻、刻蚀、沉积、离子注入、金属布线、电气检测和封装等。 基本的半导体制造过程 1.晶圆&#xff08;Wafer&#xf…

算法篇-二叉树

二叉树的遍历 分为前序、中序和后续的遍历&#xff0c;思想就是利用递归。 前序遍历-中左右 代码&#xff1a; public void travelTree(TreeNode node, List<Integer> resulst) {if (node null){return;}// 中resulst.add(node.val);// 左travelTree(node.left, resul…

基于springboot websocket和okhttp实现消息中转

1、业务介绍 消息源服务的消息不能直接推给用户侧&#xff0c;用户与中间服务建立websocket连接&#xff0c;中间服务再与源服务建立websocket连接&#xff0c;源服务的消息推给中间服务&#xff0c;中间服务再将消息推送给用户。流程如下图&#xff1a; 此例中我们定义中间服…