首页 > 编程语言 >C++使用宏来判断当前编译期支持的C++标准版本的方法

C++使用宏来判断当前编译期支持的C++标准版本的方法

时间:2024-07-10 10:42:18浏览次数:11  
标签:LANG 宏来 C++ 编译 VERSION define FL COMPILER

     需要注意的是,很多时候,某个编译器的版本并不完整支持某个C++标准,比如Visual Studio 2010 SP1,虽然支持了部分C++ 11的能力,但是依然有很多C++ 11的特性是不支持的。因此单纯通过C++标准的版本号来鉴别C++特性是否可用是并不完备的方法。具体支持情况可以参考这里

#ifdef _MSC_VER
#define FL_COMPILER_MSVC      1
#else
#define FL_COMPILER_MSVC      0
#endif

#ifdef __GNUC__
#define FL_COMPILER_GCC       1
#else
#define FL_COMPILER_GCC       0
#endif // __GNUC__  // NOLINT

#if FL_COMPILER_MSVC
// @reference https://www.cnblogs.com/bodong/p/18293350
// Each version of Visual Studio does not have complete support for the C++ standard,
// so simply judging the feature support of the C++ standard through these version numbers is incomplete.
#if _MSC_FULL_VER <= 150030729 // before Visual Studio 2008 sp1, set C++ 98
#define _MSVC_LANG 199711
#elif _MSC_FULL_VER <= 180021114 // before Visual Studio 2013 Nobemver CTP, set C++ 11
#define _MSVC_LANG 201103
#elif _MSC_FULL_VER <= 190023918 // before Visual Studio 2015 Update 2, set C++ 14
#define _MSVC_LANG 201402
#endif // after Visual Studio 2015 Update 3, _MSVC_LANG exists

#define FL_COMPILER_LANG_VERSION _MSVC_LANG
#elif defined(__cplusplus)
#define FL_COMPILER_LANG_VERSION __cplusplus
#else // set C++ 98 as default
#define FL_COMPILER_LANG_VERSION 199711
#pragma message("No valid C++ standard identification flag found, default to C++98 standard")
#endif

// is greater than ?
// Checks whether the current C++ standard is a later version
#define FL_COMPILER_IS_GREATER_THAN_CXX23 (FL_COMPILER_LANG_VERSION >= 202101)
#define FL_COMPILER_IS_GREATER_THAN_CXX20 (FL_COMPILER_LANG_VERSION >= 202002)
#define FL_COMPILER_IS_GREATER_THAN_CXX17 (FL_COMPILER_LANG_VERSION >= 201703)
#define FL_COMPILER_IS_GREATER_THAN_CXX14 (FL_COMPILER_LANG_VERSION >= 201402)
#define FL_COMPILER_IS_GREATER_THAN_CXX11 (FL_COMPILER_LANG_VERSION >= 201103)
#define FL_COMPILER_IS_GREATER_TAHN_CXX98 (FL_COMPILER_LANG_VERSION >= 199711)

// is C++ xx ?
// Check whether the current C++ standard specifies a certain version
#define FL_COMPILER_IS_CXX23 (FL_COMPILER_LANG_VERSION >= 202101)
#define FL_COMPILER_IS_CXX20 (FL_COMPILER_LANG_VERSION >= 202002 && FL_COMPILER_LANG_VERSION < 202101)
#define FL_COMPILER_IS_CXX17 (FL_COMPILER_LANG_VERSION >= 201703 && FL_COMPILER_LANG_VERSION < 202002)
#define FL_COMPILER_IS_CXX14 (FL_COMPILER_LANG_VERSION >= 201402 && FL_COMPILER_LANG_VERSION < 201703)
#define FL_COMPILER_IS_CXX11 (FL_COMPILER_LANG_VERSION >= 201103 && FL_COMPILER_LANG_VERSION < 201402)
#define FL_COMPILER_IS_CXX98 (FL_COMPILER_LANG_VERSION >= 199711 && FL_COMPILER_LANG_VERSION < 201103)

       可以简单测试一下:

#if FL_COMPILER_IS_CXX23
#pragma message("C++ 23")
#elif FL_COMPILER_IS_CXX20
#pragma message("C++ 20")
#elif FL_COMPILER_IS_CXX17
#pragma message("C++ 17")
#elif FL_COMPILER_IS_CXX14
#pragma message("C++ 14")
#elif FL_COMPILER_IS_CXX11
#pragma message("C++ 11")
#elif FL_COMPILER_IS_CXX98
#pragma message("C++ 98")
#else
#error "can't find C++ compiler version."
#endif

 

标签:LANG,宏来,C++,编译,VERSION,define,FL,COMPILER
From: https://www.cnblogs.com/bodong/p/18293439

相关文章

  • 《C++20设计模式》策略模式
    文章目录一、前言二、实现1、UML类图2、实现一、前言策略模式和状态模式实现方式一样,只是目的不同,如果会状态模式的这个也就可以随便看看啦。相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20二、实现1、UML类图2、实现#in......
  • 《C++设计模式》状态模式
    文章目录一、前言二、实现一、UML类图二、实现一、前言状态模式理解最基本上的我觉得应该也是够用了,实际用的话,也应该用的是Boost.MSM状态机。相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20二、实现一、UML类图二、实现#......
  • 《C++20设计模式》观察者模式
    一、前言观察者模式感觉真的很难,我这里就实现书上差不多的例子,供大家学习吧!相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20二、实现这里说一下观察者模式是干什么的。在实际中很有用,比如以下的例子。当股票价格变化时,自动通知所有......
  • 计算机毕业设计项目:18655 课程题库管理系统(开题答辩+程序定制+全套文案 )上万套实战教
    摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于课程题库管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了课程题库管理系统,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。这种个......
  • 计算机毕业设计项目: node.js 网上购物商城的设计与实现99525(开题答辩+程序定制+全套文
    摘 要随着社会的发展,计算机的优势和普及使得网上购物商城的开发成为必需。网上购物商城主要是借助计算机,通过对首页、站点管理(轮播图、公告栏)用户管理(管理员、注册用户)内容管理(商城资讯、资讯分类)商城管理(商城中心、分类列表、订单列表)等信息进行管理。减少管理员的工作......
  • 计算机毕业设计项目:校园新闻数据化系统的设计与实现 99293(开题答辩+程序定制+全套文案
    目 录摘要1绪论1.1研究目的和意义1.2选题背景和意义1.3系统开发技术的特色1.4springboot框架介绍1.5论文结构与章节安排22校园新闻数据化系统系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.3.2数据修改流程2.3.3数据删除流程2.3......
  • C++类和对象(上篇)
    文章目录前言一、面向过程和面向对象初步认识二、类的引入三、类的定义六、类的实例化七、类的对象大小的计算八、类成员函数的this指针总结前言类和对象是面向对象编程的两个核心概念。类是一种抽象的数据类型,是描述对象共同特......
  • C++八股(二)之C++11新特性
    一、C++11有什么新特性?⭐自动类型推导(TypeInference):引入了auto关键字,允许编译器根据初始化表达式的类型自动推导变量的类型。统一的初始化语法(UniformInitializationSyntax):引入了用花括号{}进行初始化的统一语法,可以用于初始化各种类型的对象,包括基本类型、数组、......
  • C++八股(三)之虚函数
    目录一、虚函数可以是模板函数吗?⭐二、请你说说虚函数的工作机制⭐⭐⭐三、虚函数表在什么时候创建?每个对象都有一份虚函数表吗?四、请说说操作符重载?哪些操作符不能重载?⭐⭐五、什么是纯虚函数?⭐六、虚函数可以内联吗?⭐七、析构函数一般写成虚函数的原因?构造函数为什么......
  • [C++入门]基础与语法
    1.数据类型C++作为一种强类型语言,支持多种数据类型,这些数据类型用于声明变量、函数参数、返回值等。数据类型可以分为两大类:基本数据类型和复合数据类型。基本数据类型整型(IntegerTypes):包括int(基本整型)、short(短整型)、long(长整型)、longlong(超长整型)、char(字符型,虽常作为......