当前位置: 首页 > news >正文

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

相关文章:

  • PHP的基本语法有哪些?
  • android开发工作笔记
  • MySQL8,Navicat能登陆成功,密码却忘记了
  • 使用 Outlook 窃取 NetNTLMv2 哈希
  • 植物大战僵尸杂交版如何手动修改金币钻石数
  • Golang | Leetcode Golang题解之第169题多数元素
  • Windows 通过代理服务器调用 openai 的 api
  • [大师C语言(第三十六篇)]C语言信号处理:深入解析与实战
  • UE4_材质_湿度着色器及Desaturation算法_ben材质教程
  • 头歌——机器、深度学习——手写体识别
  • Go语言之基础入门
  • 汉语拼音字母表 (声母表和韵母表)
  • 【AI大模型】驱动的未来:穿戴设备如何革新血液、皮肤检测与营养健康管理
  • Go团队的工作方式
  • 第一章 通信系统基本概念
  • C# 免费离线人脸识别 2.0 Demo
  • CSS实用技巧干货
  • Docker下部署自己的LNMP工作环境
  • React+TypeScript入门
  • React-flux杂记
  • Redis学习笔记 - pipline(流水线、管道)
  • Spring Boot MyBatis配置多种数据库
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 聚簇索引和非聚簇索引
  • 坑!为什么View.startAnimation不起作用?
  • 理解在java “”i=i++;”所发生的事情
  • 排序算法之--选择排序
  • 前端面试题总结
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 三栏布局总结
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • Nginx实现动静分离
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ###项目技术发展史
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (10)ATF MMU转换表
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (function(){})()的分步解析
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (七)理解angular中的module和injector,即依赖注入
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)可以带来幸福的一本书
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET开发者必备的11款免费工具
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [AAuto]给百宝箱增加娱乐功能