当前位置: 首页 > 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

http://www.lryc.cn/news/380950.html

相关文章:

  • 运维iptables与firewalld详解
  • 适用于 Android 的 几种短信恢复应用程序
  • Lodash-js工具库
  • Makefile实战论(一)
  • Hi3861 OpenHarmony嵌入式应用入门--PWM 三色灯
  • CH5xx USB下载工具
  • 问题1.用PGP解密出keybox.xml,过程中报“Can‘t check signature: No public key”如图,这个正常吗?如何解决?
  • 网络物理隔离后 可以用保密U盘进行数据安全交换吗?
  • 机械臂 CoppeliaSim Simulink联合仿真
  • MySQL数据库(一):数据库介绍与安装
  • 天津媒体邀约,及媒体名单?
  • Java | Leetcode Java题解之第168题Excel表列名称
  • 代码随想录算法训练营刷题复习10:二叉树、二叉搜索树复习2
  • 预测准确率达95.7%,ChatMOF利用LLM预测和生成金属有机框架,包含人工智能词汇表(AI glossary)
  • 【Linux】环境基础开发工具使用(yum、vim、gcc/g++、gdb、make/Makefile)
  • Linux基础二
  • Linux运维面试--yum安装和编译安装区别
  • redis 的内存尽量不要超过 10g,超过 10g 可能会有问题
  • 力扣(2024.06.23)
  • OpenCV颜色检测
  • VScode开发ARM环境搭建
  • AI-人工智能指数报告(四):科学、医学与教育
  • Redis内存数据库
  • LabVIEW高精度电能质量监测系统
  • Java程序之可爱的小兔兔
  • ▶《强化学习的数学原理》(2024春)_西湖大学赵世钰 Ch5 蒙特卡洛方法【model-based ——> model-free】
  • 【linux】Valgrind工具集详解(十六):交叉编译、移植到arm(失败)
  • 前端面试题(七)答案版
  • 为微信小程序项目添加eslint
  • Win10用户必看:最好用最稳定的版本在此,值得一试!