必须依赖各编译器特有宏组合判断:GCC用__GNUC__等三宏拼接整型版本码,Clang需先检测__clang__再取其major/minor/patchlevel,MSVC只信_MSC_VER(如1938对应19.38),Intel和EDG各有专属宏且须注意检测顺序与兼容模式干扰。

如果您在跨平台或跨编译器开发 C++ 项目时,需要依据预定义宏精确识别当前所用编译器及其完整版本号,则必须依赖各编译器提供的标准宏和扩展宏。以下是主流编译器(GCC、Clang、MSVC、Intel C++ Compiler、EDG)中用于判断编译器身份与版本的宏定义对照汇总,每个方案均基于实际可编译验证的宏行为。
一、GCC 编译器版本识别
GCC 通过 __GNUC__、__GNUC_MINOR__ 和 __GNUC_PATCHLEVEL__ 三个宏组合表示完整语义化版本,例如 GCC 13.2.1 对应 __GNUC__=13、__GNUC_MINOR__=2、__GNUC_PATCHLEVEL__=1;同时 __VERSION__ 提供字符串形式的完整版本标识。
1、检查是否为 GCC:#ifdef __GNUC__
2、提取主版本号:#define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
立即学习“C++免费学习笔记(深入)”;
3、匹配具体版本范围:#if GCC_VERSION >= 120000 // 表示 GCC 12.0.0 及以上
二、Clang 编译器版本识别
Clang 兼容 GCC 宏但额外提供 __clang__、__clang_major__、__clang_minor__、__clang_patchlevel__,且 __clang_version__ 为字符串字面量;需注意 Clang 在 GCC 兼容模式下可能同时定义 __GNUC__,因此必须优先检测 __clang__。
1、确认 Clang 身份:#ifdef __clang__
2、构造整型版本码:#define CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
3、排除 Apple Clang 伪装:#if defined(__apple_build_version__) && __apple_build_version__
三、MSVC 编译器版本识别
MSVC 使用 _MSC_VER 表示主次版本编码(如 MSVC 19.38 对应 _MSC_VER=1938),并以 _MSC_FULL_VER 包含补丁号(如 193833135);_MSC_BUILD 单独表示修订号;所有宏均为十进制整数,无字符串宏。
1、检测 MSVC 存在:#ifdef _MSC_VER
2、解析主版本:#define MSVC_MAJOR (_MSC_VER / 100)
3、比对已知版本:#if _MSC_VER >= 1930 // Visual Studio 2022 v17.0
四、Intel C++ Compiler(ICC/ICPC)版本识别
Intel 编译器定义 __INTEL_COMPILER(四位整数,如 2021 对应 2021.1)、__INTEL_COMPILER_UPDATE(更新号,如 3 表示 Update 3),以及兼容性宏 __INTEL_CXX11_MODE__;需注意 ICC 在 Windows 上可能同时定义 _MSC_VER,因此检测顺序须在 MSVC 之后。
1、识别 Intel 编译器:#ifdef __INTEL_COMPILER
2、获取主版本与更新号:#define INTEL_VERSION (__INTEL_COMPILER * 100 + __INTEL_COMPILER_UPDATE)
3、区分平台变体:#ifdef __INTEL_LLVM_COMPILER // OneAPI DPC++/C++ Compiler
五、EDG 前端(包括 NVIDIA HPC SDK、ARM Compiler、某些嵌入式工具链)版本识别
EDG 作为独立前端被多个厂商集成,其核心标识为 __EDG__,版本由 __EDG_VERSION__ 给出(如 600 表示 6.0);部分衍生工具链还定义 __EDG_VERSION_MINOR__ 等扩展宏;该宏不与 GCC/Clang/MSVC 冲突,但出现频率较低,需谨慎用于兜底判断。
1、检测 EDG 基础存在:#ifdef __EDG__
2、读取主版本号:#define EDG_MAJOR (__EDG_VERSION__ / 100)
3、验证是否为 NVIDIA HPC SDK:#ifdef __NVCOMPILER


















