必须依赖各编译器专属宏手动拼接版本号:MSVC用_MSC_VER/_MSC_FULL_VER查表映射;GCC用__GNUC__/__GNUC_MINOR__/__GNUC_PATCHLEVEL__直接组合;Clang需优先检测__apple_build_version__区分Apple版,并用__clang_*宏拼接;ICC、PGI、armclang、XL等均需各自宏组合,无统一标准宏。

如果您需要在C++代码中根据宏定义识别当前编译器及其完整版本号,必须依赖各编译器预定义的宏进行判断。不同编译器(如MSVC、GCC、Clang、ICC、PGI等)提供各自专属的宏,且版本编码方式差异显著。以下是覆盖主流编译器的完整宏定义对照表及判别方法:
一、Microsoft Visual C++(MSVC)
MSVC使用_MSC_VER宏表示主版本号,其值为整数,需查表映射到实际版本;_MSC_FULL_VER提供更精确的完整版本(含补丁号),但格式为整型,需按千位/百位/个位拆解。
1、检查_MSC_VER是否已定义,若未定义则非MSVC环境。
2、若_MSC_VER == 1930,对应Visual Studio 2022 17.0。
3、若_MSC_VER == 1929,对应Visual Studio 2019 16.11。
4、提取_MSC_FULL_VER:例如值为193030706,表示主版本19.30、次版本30706,即VS2022 17.0.6。
5、注意:_MSC_VER不随Update版本递增,必须结合_MSVC_LANG和编译器实际行为验证C++标准支持度。
二、GNU Compiler Collection(GCC)
GCC通过__GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__三个宏分别表示主、次、补丁版本号,可直接拼接为完整语义化版本。
1、确认__GNUC__宏存在,排除非GCC环境。
2、读取__GNUC__值(如12),代表GCC主版本。
3、读取__GNUC_MINOR__值(如2),代表次版本。
4、读取__GNUC_PATCHLEVEL__值(如1),代表补丁号。
5、组合为字符串"12.2.1",即完整GCC版本。
6、注意:__VERSION__宏返回编译器版本字符串(如"12.2.1 20220924 (Red Hat 12.2.1-4)"),但含构建信息,不可用于数值比较。
三、Clang(含Apple Clang)
Clang使用__clang_major__、__clang_minor__、__clang_patchlevel__三宏表示版本,与GCC结构一致;但Apple Clang额外定义__apple_build_version__,需优先检测以区分。
1、先检测__apple_build_version__是否存在,若存在则为Apple Clang。
2、若__apple_build_version__ == 14030022,对应Xcode 14.3.1(Clang 14.0.3)。
3、若未定义Apple宏,则检测__clang__,确认为标准Clang。
4、读取__clang_major__(如15)、__clang_minor__(如0)、__clang_patchlevel__(如7)。
5、组合为"15.0.7"作为Clang完整版本。
6、注意:Apple Clang的__clang_*宏反映底层LLVM版本,而非Xcode显示版本,必须交叉核对__apple_build_version__。
四、Intel C++ Compiler(ICC/ICPC)
ICC使用__INTEL_COMPILER表示主版本(如20210),__INTEL_COMPILER_UPDATE表示Update号(如1),二者组合构成完整版本。
1、检测__INTEL_COMPILER是否定义,若未定义则非ICC环境。
2、提取__INTEL_COMPILER前四位:2021 → 对应2021版。
3、提取后一位或两位:若值为20211,则Update为1;若为202110,则Update为10。
4、读取__INTEL_COMPILER_UPDATE宏值,与主版本拼接,如"2021.1"。
5、注意:ICC 2021.2起已停止独立发布,后续由Intel oneAPI DPC++/C++ Compiler继承,需检测__INTEL_LLVM_COMPILER宏。
五、NVIDIA HPC SDK(PGI)
PGI编译器(现属NVIDIA HPC SDK)使用__PGI宏标识,版本通过__PGIC__(主)、__PGIC_MINOR__(次)、__PGIC_PATCHLEVEL__(补丁)获取。
1、检测__PGI是否定义,若未定义则非PGI环境。
2、读取__PGIC__(如22),代表HPC SDK主版本22。
3、读取__PGIC_MINOR__(如7),代表次版本。
4、读取__PGIC_PATCHLEVEL__(如0),代表补丁号。
5、组合为"22.7.0"作为完整HPC SDK版本。
6、注意:自HPC SDK 21.7起,PGI宏仍保留兼容性,但推荐优先使用__NVCOMPILER宏识别NVIDIA编译器。
六、ARM Compiler(armclang)
armclang是基于LLVM的ARM定制编译器,同时定义Clang宏和ARM专属宏__ARMCOMPILER_VERSION,后者为整型编码,需查表解析。
1、检测__ARMCOMPILER_VERSION,若存在则为armclang。
2、该宏值为六位整数:前两位为主版本(如23),中间两位为次版本(如05),末两位为补丁(如12)→ "23.05.12"。
3、若__ARMCOMPILER_VERSION == 230512,对应ARM Compiler 6.18(armclang 6.18 = 23.05.12)。
4、同时检查__clang__确保底层为Clang架构。
5、注意:armclang 6.x系列对应ARM Compiler 6,而armclang 7.x起归属ARM Compiler 7,版本映射关系不可跨代套用。
七、IBM XL C/C++
XL编译器使用__xlC__宏标识,版本通过__xlC_ver(主)、__xlC_rel(次)、__xlC_mod(修订)三级宏表示,均为整型。
1、检测__xlC__宏是否存在,确认XL环境。
2、读取__xlC_ver(如16),代表XL主版本16。
3、读取__xlC_rel(如1),代表发布号。
4、读取__xlC_mod(如0),代表修订号。
5、组合为"16.1.0"作为完整XL版本。
6、注意:XL for AIX与XL for Linux宏定义完全相同,需结合__AIX或__linux__宏进一步区分目标平台。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











