跨平台C++需用预定义宏识别编译器:1. MSVC用_MSC_VER;2. GCC用__GNUC__并排除__clang__;3. Clang用__clang__;4. Intel用__INTEL_COMPILER;5. ARM用__ARMCLANG_VERSION或__ARMCC_VERSION。

如果您在编写跨平台 C++ 代码时需要识别当前使用的编译器厂商(如 MSVC、GCC、Clang 等),则必须依赖编译器预定义的宏进行条件编译。以下是多种可靠且广泛支持的判断方法:
一、检测 Microsoft Visual C++ 编译器
MSVC 编译器定义了多个专属宏,其中 _MSC_VER 是最稳定、最常用于版本判定的核心宏,其值为整型数字(如 1930 表示 VS 2022 17.3)。同时,_MSC_FULL_VER 提供更精确的完整版本号,而 _MSC_BUILD 表示补丁级别。
1、使用 #ifdef _MSC_VER 判断是否为 MSVC 环境。
2、通过比较 _MSC_VER 值区分具体版本:例如 _MSC_VER >= 1930 表示 VS 2022 或更新版本。
3、可结合 _MSC_EXTENSIONS 判断是否启用了 Microsoft 扩展语法。
二、检测 GCC 及兼容编译器(含 MinGW、TDM-GCC)
GCC 定义了 __GNUC__、__GNUC_MINOR__ 和 __GNUC_PATCHLEVEL__ 三个宏,分别表示主版本、次版本和修订号。该组合在所有 GCC 兼容编译器中均存在,是识别 GNU 工具链的权威依据。
1、使用 #ifdef __GNUC__ 判定是否为 GCC 或其衍生工具链。
2、检查 __GNUC__ >= 12 可确认 GCC 12 或更高版本。
3、若需排除 Clang(因 Clang 也定义 __GNUC__),应额外验证 !defined(__clang__)。
三、检测 Clang 编译器
Clang 同时定义 __clang__ 和 __clang_major__ 等宏,且明确不定义 _MSC_VER 和 __GNUC__ 的独占语义(尽管它兼容 GCC 宏)。因此,__clang__ 是唯一可靠的 Clang 标识符。
1、使用 #ifdef __clang__ 直接判定 Clang 环境。
2、通过 __clang_major__ * 100 + __clang_minor__ 计算版本码,例如 1500 表示 Clang 15.0。
3、可配合 __apple_build_version__ 区分 Apple Clang 与上游 Clang。
四、检测 Intel C++ Compiler(ICC/ICPC)
Intel 编译器定义了 __INTEL_COMPILER(整型值,如 202100 表示 2021.1)和 __INTEL_COMPILER_BUILD_DATE。注意:新版 ICC 已逐步转向 LLVM 后端,但仍保留该宏以维持兼容性。
1、使用 #ifdef __INTEL_COMPILER 进行基础识别。
2、解析 __INTEL_COMPILER / 100 获取主版本号(如 202100 → 2021)。
3、若需排除 ICC 的 LLVM 模式,可叠加检查 !defined(__clang__) && defined(__INTEL_COMPILER)。
五、检测 ARM Compiler(ARMCC / ARMCLANG)
ARM Compiler 6(基于 LLVM)定义 __ARMCC_VERSION(如 6150001 表示 6.15.1),而旧版 ARMCC 5 使用 __ARMCC_5。ARMClang 则同时定义 __ARMCLANG_VERSION 和 __clang__。
1、优先检查 __ARMCLANG_VERSION 以识别 ARM 官方 Clang 变体。
2、若未定义,则检查 __ARMCC_VERSION 判定 ARM Compiler 6。
3、对 ARMCC 5,使用 #ifdef __ARMCC_5 进行特判。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











