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_constexprstd::cout << "support constexpr" << std::endl;
#elsestd::cout << "Warning: unsupport constexpr" << std::endl;
#endif#ifdef __cpp_structured_bindingsstd::cout << "support structured bindings" << std::endl;
#elsestd::cout << "Warning: unsupport structured bingdings" << std::endl;
#endif#ifdef __cpp_constevalstd::cout << "support consteval" << std::endl;
#elsestd::cout << "Warning: unsupport consteval" << std::endl;
#endif#ifdef __cpp_aggregate_paren_initstd::cout << "support aggregate paren init" << std::endl;
#elsestd::cout << "Warning: unsupport aggregate paren init" << std::endl;
#endif// library features
#ifdef __cpp_lib_rangesstd::cout << "ranges library available" << std::endl;
#elsestd::cout << "Warning: ranges library unavailable" << std::endl;
#endif#ifdef __cpp_lib_filesystemstd::cout << "filesystem library available" << std::endl;
#elsestd::cout << "Warning: filesystme library unavailable" << std::endl;
#endif#ifdef __cpp_lib_anystd::cout << "any library available" << std::endl;
#elsestd::cout << "Warning: any library unavailable" << std::endl;
#endif#ifdef __cpp_lib_fbcstd::cout << "fbc library available" << std::endl;
#elsestd::cout << "Warning: fbc library unavailable" << std::endl;
#endifreturn 0;
}

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

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

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

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

相关文章

区块链的优势与挑战:为什么区块链如此重要?

区块链听起来像是一种高科技的魔法&#xff0c;很多人都想知道它到底是怎么回事&#xff0c;为什么会引起如此大的关注。今天&#xff0c;我们就来揭开区块链的神秘面纱&#xff0c;看看它的优势和挑战&#xff0c;顺便聊聊为什么它会变得如此重要。 优势篇 1. 去中心化&…

流水线作业模拟程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 流水线作业模拟 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private int Count 0;private bool IsStop false;private void uiLight1_Click(object sender, EventArgs e…

[MYSQL] MYSQL库的操作

前言 本文主要介绍MYSQL里 库 的操作 请注意 : 在MYSQL中,命令行是不区分大小写的 1.创建库 create database [if not exists] database_name [charsetutf8 collateutf8_general_ci] ...] create database 是命名语法,不可省略[if not exists] 如果不存在创建,如果存在跳过…

GESP 四级急救包(2):客观题真题集

客观题真题集 一、选择题1. 真题梳理2. 真题答案3. 重难点点播(1) 指针和地址(2) 时间复杂度 二、判断题1. 真题梳理2. 真题答案 一、选择题 1. 真题梳理 若函数声明为 void f(int &a, int b, const int &c)&#xff0c;且在主函数内已经声明了 x , y , z x,y,z x,y,…

最新Node.js安装及配置详细教程

文章目录 下载Node.js安装Node.js配置Node.js1、修改npm包的全局安装路径和缓存路径2、环境变量设置3、镜像源配置4、安装其他包管理工具 下载Node.js 下载&#xff1a;https://nodejs.org/en/download/prebuilt-installer&#xff0c;下载LTS版本的&#xff0c;LTS(Long Time…

代码随想录算法训练营day67 | 110.字符串接龙、105. 有向图的完全可达性、106. 岛屿的周长

本次题目全部来自卡码网 110.字符串接龙 本题只需要求出最短路径的长度就可以了&#xff0c;不用找出具体路径。 所以这道题要解决两个问题&#xff1a; 图中的线是如何连在一起的起点和终点的最短路径长度 首先题目中并没有给出点与点之间的连线&#xff0c;而是要我们自…

驼峰命名法在编程中的应用

驼峰命名法在编程中的应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;驼峰命名法&#xff08;Camel Case&#xff09;是一种常见的命名约定&#xff0c;在编…

IPython “%%script“ 魔法命令:跨平台脚本执行指南

IPython是一个强大的交互式Python解释器&#xff0c;提供了许多增强功能来提高开发效率。其中&#xff0c;%%script魔法命令是一个非常有用的特性&#xff0c;它允许用户在IPython环境中执行外部脚本。本文将详细介绍%%script命令的使用方法&#xff0c;包括其基本概念、使用场…

前端 JS 经典:函数签名

函数签名是什么&#xff1f;函数签名 函数名 参数 返回类型。 当我们明确了这 3 样东西&#xff0c;那么这个函数的作用和用法就确定了&#xff0c;它内部怎么实现的&#xff0c;我们完全不用管。 如下&#xff0c;我们知道这是一个判断属性是否对象的函数&#xff0c;只需…

SQL 基本语法

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系型数据库的语言。以下是SQL的基本语法&#xff1a; 创建数据库&#xff1a; CREATE DATABASE database_name;使用数据库&#xff1a; USE database_name;创建表&#xff1a; CREATE TABLE table_…

基于多模态知识图谱的多模态推理-MR-MKG

MR-MKG论文中提出了一种新的多模态推理方法&#xff0c;即利用多模态知识图&#xff08;Multimodal Knowledge Graph, MMKG&#xff09;进行多模态推理的方法。这种方法旨在通过从MMKG中学习&#xff0c;扩展大型语言模型&#xff08;LLMs&#xff09;的多模态知识。 1 三个模…

面对.rmallox勒索病毒:如何有效防范及应对

引言&#xff1a; 在当今数字化社会&#xff0c;网络安全问题日益严重&#xff0c;勒索病毒成为企业和个人不可忽视的威胁之一。最近出现的.rmallox勒索病毒更是给全球各地的用户带来了严重的数据安全问题。本文将探讨.rmallox勒索病毒的特点、感染方式及应对策略&#xff0c;…

探索CSS布局:创建一个居中的内嵌方块示例

在网页设计中&#xff0c;布局是至关重要的部分。CSS提供了多种方式来实现元素的布局&#xff0c;包括居中对齐、外边距、内边距等。本文将通过一个简单的示例&#xff0c;介绍如何使用CSS来创建一个居中的内嵌方块&#xff0c;并探讨其背后的布局原理。 HTML 结构 首先&…

java服务MultipartFile入参测试

项目中经常会涉及到文件的上传下载以及导入相关的功能&#xff0c;今天针对MultipartFile类型文档导入写一下如何测试。 文档导入接口完成&#xff0c;使用postman测试&#xff0c;使用POST方法&#xff0c;进入Body模块&#xff0c;选择form-data选项&#xff0c;key的框体右侧…

微服务部署上线过程总结

目录 一、找到适合自己的部署方式 二、开始部署&#xff0c;先安装需要的环境 2.1 梳理一下都需要安装什么软件 2.2 配置数据库环境 2.3 配置redis 2.4 配置nacos 2.5 配置rabbitmq 2.6 配置docker环境 三、环境配置好了&#xff0c;开始部署后端 3.1 梳理后端都…

韩顺平0基础学java——第32天

p638-652 Properties类 list&#xff1a;这个设备可以是一个流对象。 修改&#xff1a;如果该文件里没有Key&#xff0c;那即是创建&#xff0c;如果是有那就是修改。 继续坦克大战 防止敌人坦克重叠 满脑子都是今汐&#xff0c;亚达哟&#x1f62d;&#x1f62d;&#x1f6…

2, 搭建springCloud 项目 测试demo

上篇文章 新建了父依赖服务&#xff0c;这篇文章就建两个demo测试服务。 因为后面需要做服务间的通讯测试&#xff0c;所以至少需要建两个服务 建个子模块 同样的方式建连个demo服务 给java 和resources目录添加属性 在resources目录下建一个applications.yml文件&#xff0c;…

全志T527 CPU测试

一、基本介绍&#xff08;8核 A55&#xff09; 全志科技T527采用多核异构设计&#xff0c;集成了CPU、GPU、NPU、DSP、MCU等各种计算单元&#xff0c;为各种复杂场景的多任务处理、专用数据处理以及算法应用提供了高效且灵活的解决方案。 其中&#xff1a; T527集成了8核1.8…

嵌入式应用开发屏幕教程8080并口通信

目录 #8080相关概念介绍 #8080并行通信硬件连接部分 #并行通信硬件电路连接图 #并行通信读数据规定 #并行通信写数据规定 #8080相关概念介绍 通信协议分为串行通信协议&#xff0c;并行通信协议&#xff0c;而本章所讲的8080是一种并行通信协议&#xff0c;并行通信协议 Pa…

Redis支持多种数据类型,每种数据类型都有其独特的特点和适用场景。

Redis支持多种数据类型&#xff0c;每种数据类型都有其独特的特点和适用场景。以下是Redis的主要数据类型及其应用场景的详细介绍&#xff1a; 1. 字符串&#xff08;String&#xff09; 特点&#xff1a;Redis中的String是最基本的数据类型&#xff0c;可以存储二进制安全的…