C++如何检查编译器的版本和特性支持?(预定义宏)
发布时间 - 2026-01-02 00:00:00 点击率:次最可靠的方式是直接查预定义宏,因不同编译器及版本定义各异,且宏能准确反映实际启用的特性;需结合编译器标识宏、__cplusplus标准宏及特性检测宏(如__cpp_if_constexpr)进行判断。
直接查预定义宏是最可靠的方式,因为不同编译器、不同版本定义的宏不同,且宏能反映实际启用的特性(比如是否开了 /std:c++17 或 -std=c++20),比查文档或 IDE 显示更准。
查编译器身份和版本号
每个主流编译器都提供一组标识宏,用来区分厂商和具体版本:
-
GCC / Clang:用
__GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__;Clang 还额外定义__clang__和__clang_major__等 -
MSVC:用
_MSC_VER(如 1930 表示 VS2025 17.3),_MSC_FULL_VER包含补丁号 -
Intel C++ Compiler:定义
__INTEL_COMPILER
示例判断:
#if defined(_MSC_VER)
#if _MSC_VER >= 1930
// VS2025 17.3+
#endif
#elif defined(__clang__)
#if __clang_major__ >= 15
// Clang 15+
#endif
#elif defined(__GNUC__)
#if __GNUC__ >= 11
// GCC 11+
#endif
#endif查 C++ 标准版本(核心宏)
标准宏 __cplusplus 是关键,它随编译选项变化,不是固定值:
- C++98/03 →
199711L - C++11 →
201103L - C++14 →
201402L - C++17 →
201703L - C++20 →
202502L - C++23 →
202502L(GCC 13+、Clang 16+、MSVC 17.7+ 支持)
注意:MSVC 在较旧版本中可能不更新 __cplusplus(需配合 /Zc:__cplusplus 开关),而 GCC/Clang 默认准确。
查具体语言特性的支持(特性检测宏)
比起硬写版本判断,直接查特性宏更安全——它由编译器根据当前标准和开关自动定义:
-
__cpp_constexpr:值表示支持的 constexpr 版本(如 201304L = C++14 constexpr) -
__cpp_if_constexpr:C++17 if constexpr(值 ≥ 201606L) -
__cpp_structured_bindings:结构化绑定(≥ 201606L) -
__cpp_concepts:概念(≥ 201907L) -
__cpp_lib_format:(≥ 202510L)
这些宏在 SD-6 中标准化,推荐优先
使用。例如:
#if __cpp_if_constexpr >= 201606L
if constexpr (std::is_integral_v) { /* ... */ }
#endif 实用建议
- 调试时加一行
#pragma message("C++ standard: " STRINGIFY(__cplusplus))(配合#define STRINGIFY(x) #x)快速打印 - 用
__has_include(检查头文件是否存在,比版本判断更健壮) - 避免只依赖编译器版本号做特性判断——同一编译器不同配置下特性可能开关不一
- 现代项目可借助
cmake的target_compile_features()自动处理兼容性
基本上就这些。预定义宏不是魔法,但用对了能让你的跨编译器代码既健壮又清晰。
# c++
# red
# elif
# define
# if
# format
# ide
# 最可靠
# 开了
# 能让
# 能不
# 绑定
# 是否存在
# 结构化
# 它由
# 头文件
# 对了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
智能起名网站制作软件有哪些,制作logo的软件?
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Laravel如何使用Vite进行前端资源打包?(配置示例)
Laravel如何使用查询构建器?(Query Builder高级用法)
UC浏览器如何设置启动页 UC浏览器启动页设置方法
黑客如何利用漏洞与弱口令入侵网站服务器?
如何在景安服务器上快速搭建个人网站?
JS经典正则表达式笔试题汇总
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
七夕网站制作视频,七夕大促活动怎么报名?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
Laravel中的withCount方法怎么高效统计关联模型数量
如何构建满足综合性能需求的优质建站方案?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
如何在七牛云存储上搭建网站并设置自定义域名?
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
如何在企业微信快速生成手机电脑官网?
原生JS获取元素集合的子元素宽度实例
百度浏览器如何管理插件 百度浏览器插件管理方法
Bootstrap整体框架之CSS12栅格系统
高性价比服务器租赁——企业级配置与24小时运维服务
如何用AI帮你把自己的生活经历写成一个有趣的故事?
网站页面设计需要考虑到这些问题
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
高防服务器如何保障网站安全无虞?
如何在香港服务器上快速搭建免备案网站?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何在Windows虚拟主机上快速搭建网站?
网站建设保证美观性,需要考虑的几点问题!
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Linux系统命令中screen命令详解
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Bootstrap整体框架之JavaScript插件架构
网站制作企业,网站的banner和导航栏是指什么?
如何快速启动建站代理加盟业务?
,交易猫的商品怎么发布到网站上去?
如何用PHP快速搭建CMS系统?
Laravel集合Collection怎么用_Laravel集合常用函数详解
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
PHP正则匹配日期和时间(时间戳转换)的实例代码
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】

