跨平台C++需用预定义宏精准识别编译器版本:MSVC用_MSC_VER(如1930→VS2022 17.3),GCC用__GNUC__等三宏组合,Clang用__clang_*三宏并排除GCC/ICC,ICC用__INTEL_COMPILER及更新号,Apple Clang需结合__APPLE__和__apple_build_version__。

如果您在跨平台 C++ 项目中需要依据编译器类型及版本启用特定代码分支,则必须依赖预定义宏进行精准识别。不同编译器(如 MSVC、GCC、Clang、ICC)及其各主次版本暴露的宏存在显著差异,且同一编译器在不同平台下宏定义行为亦不一致。以下是针对主流编译器完整版本号判别的对照方法:
一、识别 Microsoft Visual C++(MSVC)版本
MSVC 使用 _MSC_VER 宏表示编译器主版本号,其值为整数,需通过数学换算还原为常见版本格式(如 1930 表示 VS 2022 17.3)。该宏在所有 Windows 平台 MSVC 编译环境下稳定存在,且不受 /Zc:__cplusplus 影响。
1、检查是否为 MSVC 编译器:#ifdef _MSC_VER
2、根据 _MSC_VER 值映射版本:_MSC_VER == 1930 → VS 2022 17.3;_MSC_VER == 1929 → VS 2019 16.11;_MSC_VER == 1916 → VS 2017 15.9
3、兼容旧版判断:若需区分 VS 2015 及更早版本,可结合 _MSC_FULL_VER 获取完整构建号(如 190024210 表示 VS 2015 Update 3)
二、识别 GCC 版本
GCC 提供 __GNUC__、__GNUC_MINOR__ 和 __GNUC_PATCHLEVEL__ 三个独立宏,分别对应主、次、补丁版本号。这些宏在所有 GCC 支持平台(Linux、macOS、MinGW)上均可靠,但 MinGW-w64 的 clang-cl 模式下可能被屏蔽。
1、确认 GCC 环境:#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
2、提取版本组合:__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__
3、常用映射示例:110201 → GCC 11.2.1;120100 → GCC 12.1.0;130300 → GCC 13.3.0
三、识别 Clang 版本
Clang 同时兼容 GCC 宏,但自身提供 __clang_major__、__clang_minor__、__clang_patchlevel__ 三宏。需优先排除 GCC 和 ICC,避免误判。Clang 在 macOS Xcode、Linux、Windows(LLVM/MinGW)下均启用这些宏。
1、严格判定 Clang:#if defined(__clang__) && !defined(__llvm__) && !defined(__INTEL_COMPILER)
2、构造统一版本码:__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__
3、典型值对照:140000 → Clang 14.0.0;150003 → Clang 15.0.3;160006 → Clang 16.0.6
四、识别 Intel C++ Compiler(ICC/ICPC)版本
ICC 使用 __INTEL_COMPILER 宏表示主版本号(如 2021 对应 2021.1),__INTEL_COMPILER_UPDATE 表示更新号。该宏在 Windows(ICL)、Linux(ICC)、macOS(ICPC)下均有效,但自 2021.2 起 Intel OneAPI 编译器改用 __INTEL_LLVM_COMPILER 宏替代。
1、检测传统 ICC:#ifdef __INTEL_COMPILER
2、解析版本:__INTEL_COMPILER == 1910 && __INTEL_COMPILER_UPDATE == 4 → ICC 19.1.4
3、检测 OneAPI LLVM 模式:#ifdef __INTEL_LLVM_COMPILER,此时 __INTEL_LLVM_COMPILER 值为 20210400 表示 2021.4
五、识别 Apple Clang(Xcode 自带)版本
Apple Clang 是 Clang 的定制分支,其 __apple_build_version__ 宏提供唯一构建号(如 13160021 表示 Xcode 13.3.1),而 __clang_* 宏反映底层 Clang 版本而非 Apple 发行版号。仅在 macOS 平台有效,且需与 __APPLE__ 共同判断。
1、限定平台与编译器:#if defined(__APPLE__) && defined(__clang__) && !defined(__INTEL_COMPILER)
2、获取 Apple 构建标识:__apple_build_version__ == 14030022 → Xcode 14.3.1
3、避免混淆:__clang_version__ 返回 "14.0.3 (clang-1403.0.22.11.100)",不可直接用于 Xcode 版本映射
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











