C++ 根据宏定义自动化识别当前系统编译器的完整版本号及对照汇总全集【干货】

浅婷小哥_6120

浅婷小哥_6120

2026-06-03

659人浏览

原创

跨平台c++项目中需用预处理器宏精准提取gcc、clang、msvc完整版本号:gcc用__gnuc__等三宏拼接;clang须优先检测__clang__并用其专用宏;msvc需解析_msc_ver或_msc_full_ver;统一接口current_compiler_version按msvc→clang→gcc顺序判断。

c++ 根据宏定义自动化识别当前系统编译器的完整版本号及对照汇总全集【干货】

在跨平台C++项目中,需要根据编译器宏精准识别当前实际使用的编译器完整版本号(如GCC 13.2.0、Clang 16.0.6、MSVC 19.38.33135),而非仅判断类型;手动拼接版本字符串易出错,且不同编译器宏命名、位移规则、补零逻辑互不兼容。

识别 GCC 完整版本号

GCC 提供 __GNUC__、__GNUC_MINOR__、__GNUC_PATCHLEVEL__ 三个宏,但直接拼接会丢失补零和点号分隔逻辑。例如 __GNUC__ == 13、__GNUC_MINOR__ == 2、__GNUC_PATCHLEVEL__ == 0 必须输出 "13.2.0",而非 "13.2.0"(看似一样,但 __GNUC_PATCHLEVEL__ 为 0 时若忽略会导致 "13.2" 错误截断)。

第一步:定义辅助宏,强制补零并转为字符串字面量:

#define STRINGIFY(x) #x → #define TOSTRING(x) STRINGIFY(x) → #define GCC_VERSION_STR TOSTRING(__GNUC__) "." TOSTRING(__GNUC_MINOR__) "." TOSTRING(__GNUC_PATCHLEVEL__)

第二步:在代码中直接使用 GCC_VERSION_STR,它将展开为 "13.2.0" 这类标准格式字符串字面量。注意:该宏仅在 GCC 下有效,其他编译器预处理时未定义 __GNUC_PATCHLEVEL__ 会报错,【必须用 #ifdef __GNUC__ 包裹】。

识别 Clang 完整版本号

Clang 同时定义 GCC 兼容宏(如 __GNUC__),不能直接依赖;必须优先检测 __clang__,再读取 __clang_major__、__clang_minor__、__clang_patchlevel__。

方法一:与 GCC 类似构造字符串宏:

#ifdef __clang__
# define CLANG_VERSION_STR TOSTRING(__clang_major__) "." TOSTRING(__clang_minor__) "." TOSTRING(__clang_patchlevel__)
#endif

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

方法二:利用 Clang 自带的 __VERSION__ 字符串(如 "Ubuntu Clang 16.0.6"),但含主机信息,不可靠;【应弃用 __VERSION__ 提取版本】,因其格式无保证,macOS 和 Windows 下内容差异极大。

识别 MSVC 完整版本号

MSVC 不提供分段宏,只提供 _MSC_VER 整型值(如 1938 表示 MSVC 19.38),需人工映射。微软官方已明确:从 MSVC 19.30 起,_MSC_VER 高两位为大版本(19)、低两位为小版本(38),但补零规则特殊——19.38.33135 中的 33135 是内部构建号,无法从宏推导。

第一步:提取主版本与次版本:

#ifdef _MSC_VER
# define MSVC_MAJOR (_MSC_VER / 100)
# define MSVC_MINOR (_MSC_VER % 100)
# define MSVC_VERSION_STR TOSTRING(MSVC_MAJOR) "." TOSTRING(MSVC_MINOR)
#endif

第二步:若需包含构建号(如 19.38.33135),必须额外依赖 _MSC_FULL_VER(如 193833135),按规则拆解:_MSC_FULL_VER / 1000000 得主版本,(_MSC_FULL_VER / 1000) % 100 得次版本,_MSC_FULL_VER % 1000 得构建号——但此值仅在 VS2017+ 可用,旧版未定义。

统一接口封装:编译器版本字符串常量

为避免重复判断,定义顶层宏 CURRENT_COMPILER_VERSION,自动选择对应编译器的完整版本字符串:

#if defined(_MSC_VER)
# define CURRENT_COMPILER_VERSION MSVC_VERSION_STR
#elif defined(__clang__)
# define CURRENT_COMPILER_VERSION CLANG_VERSION_STR
#elif defined(__GNUC__)
# define CURRENT_COMPILER_VERSION GCC_VERSION_STR
#else
# define CURRENT_COMPILER_VERSION "unknown"
#endif

该宏展开后即为标准语义的版本字符串,可直接用于日志输出或编译期断言。注意:多个编译器宏可能共存(如 Clang 定义了 __GNUC__),【判断顺序必须是 MSVC → Clang → GCC】,否则 Clang 会被误判为 GCC。

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

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2024.03.14

2228

9

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

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

2024.03.14

999

6

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

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

2024.03.14

427

5

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

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

2024.03.14

307

5

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

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

2024.03.14

406

5

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

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

2024.03.14

580

5

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

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

2024.03.21

1389

9

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

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

2024.03.22

1197

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人学习