C++ 根据宏定义判断当前系统当前的编译器完整版本对照表及其汇总汇总表【干货】

小雪酱_7262

小雪酱_7262

2026-05-18

491人浏览

原创

C++标准不规定宏名,各编译器自行定义且版本间可能变动;可靠宏仅限__GNUC__、__clang_major__、_MSC_VER、__cplusplus等少数几个,其余须查文档并实测验证。

c++ 根据宏定义判断当前系统当前的编译器完整版本对照表及其汇总汇总表【干货】

没有“完整版本对照表”这种东西——C++ 标准不规定宏名,各编译器自行定义,且同一编译器不同版本间也可能变动。你真正能依赖的,只有少数几个标准化程度高、广泛支持的宏,其余必须查文档、实测、加防御性判断。

哪些宏是相对靠谱、可直接用的

以下宏在 GCC、Clang、MSVC 主流版本中稳定存在,语义清晰,适合做基础平台/编译器识别:

  • __GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__:GCC 及其兼容编译器(如 MinGW、ICC)提供,Clang 也定义但值为 4、2、1(历史兼容,不代表真实版本)
  • __clang_major__、__clang_minor__、__clang_patchlevel__:Clang 专属,准确反映 Clang 自身版本(不是它模拟的 GCC 版本)
  • _MSC_VER:MSVC 唯一可靠版本标识,值为整数(如 1930 表示 VS2022 17.0),需查微软官方映射表,不能直接当主次版本拆分
  • __cplusplus:标准 C++ 版本标识(如 201703L),注意它反映的是 -std= 设置,不是编译器能力上限

为什么不能靠 __VERSION__ 或字符串宏做自动化判断

__VERSION__ 是编译器自定义字符串(如 "13.2.0"、"Apple clang version 15.0.0 (clang-1500.1.0.2.5)"),不可解析、无格式保证,连空格和括号都可能变。曾有人试图用预处理器字符串化 + strcmp 比较,结果在 Clang 14 升 15 时因括号内空格变化直接失效。

更危险的是误信“隐含宏”:比如以为 __clang__ 存在就等于 Clang ≥ 12,但其实它从 Clang 2.9 就存在;又或者把 _MSC_FULL_VER 当通用字段,却不知它只在 MSVC 高版本(VS2015+)才稳定输出。

跨编译器判断的实用写法(带防错)

真正健壮的判断必须满足三点:明确目标(你要适配什么特性?)、分层检测(先编译器大类,再版本边界)、留退路(没匹配到就 fallback)。例如启用 [[likely]]:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
#if defined(__clang__)
#  if __clang_major__ >= 13
#    define ATTR_LIKELY [[likely]]
#  else
#    define ATTR_LIKELY __attribute__((hot))
#  endif
#elif defined(__GNUC__)
#  if __GNUC__ >= 12
#    define ATTR_LIKELY [[likely]]
#  else
#    define ATTR_LIKELY __attribute__((hot))
#  endif
#elif defined(_MSC_VER)
#  if _MSC_VER >= 1930  // VS2022 17.0+
#    define ATTR_LIKELY [[likely]]
#  else
#    define ATTR_LIKELY __declspec(hot)
#  endif
#else
#  define ATTR_LIKELY
#endif

关键点:[[likely]] 在 GCC 12+、Clang 13+、MSVC 1930+ 才真正稳定支持,低于此版本用等效替代,完全不支持时直接空定义——而不是硬塞一个未定义行为的宏。

查版本映射表时最容易忽略的细节

MSVC 的 _MSC_VER 和 Visual Studio 版本不是线性对应;GCC 的 __GNUC_PATCHLEVEL__ 在早期版本(如 4.8)可能为 0 但实际发布版有多个 patch;Clang 的 __clang_patchlevel__ 在 Apple Clang 中永远为 0(它只用 __apple_build_version__ 区分 Xcode 内部版本)。

最省事的做法:对每个目标编译器,只记 2–3 个关键分界点(如 Clang 12/13/14),其他版本统一按“已知最低支持版本”处理;所有判断逻辑必须配合 CI 实际跑多版本验证,光看文档会漏掉 patch 版本的 ABI 微调。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2268

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习