惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
爱范儿
爱范儿
小众软件
小众软件
K
Kaspersky official blog
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
V
Vulnerabilities – Threatpost
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX
C
Check Point Blog
S
Schneier on Security
P
Palo Alto Networks Blog
IT之家
IT之家
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Project Zero
Project Zero
Y
Y Combinator Blog
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
S
Securelist
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理

博客园 - DoubleLi

Git 自动添加 git 子模块(.gitmodules) 如何在gitlab中使用子模块 CMake应用:模块化及库依赖 聊聊git push到远程服务器出现RPC failed问题 Qt Create多核编译配置 C++程序的发布部署方式及缺失依赖库dll的解决方法 VS+QT生成的exe文件所依赖的dll文件和路径 vs如何发布exe并附带动态链接库dll MobaXterm使sftp目录与terminal目录同步 从GPS/北斗模块中获取经纬度 Loguru:Python 日志终极解决方案 VsCode C++ namespace has no member错误 VS Code 提示 namespace “std“ has no member “***“ 解决方法 windows平台中使用vscode远程连接linux进行c++开发配置教程(内容详细适合小白)-2021-3-30 vscode C++ 自动补全失效 从零开始的vscode安装及环境配置教程(C/C++)(Windows系统) VScode 完全卸载并清除原有配置 vscode中 “std“ 没有成员 “round“C/C++(135) vscode 提示 namespace “std“ has no member “mutex“ 的解决方法
详解 Visual Studio、MSVC、编译器版本,看完就不再困惑啦!
DoubleLi · 2024-09-05 · via 博客园 - DoubleLi

在这里插入图片描述

新手在刚使用 Visual Studio 开发 C++ 应用程序时往往会对其版本产生困惑,包括 Visual Studio 版本、MSVC 版本、工具集版本等等。因此本文尝试给大家解释一下 Visual Studio 不同版本号的对应关系。

以 Visual Studio 2022 为例,版本信息包括:

  • Visual Studio 发布年份(营销版本号),例如 Visual Studio 2022
  • Visual Studio 的实际版本号,例如 Visual Studio 17.0
  • Visual C++(MSVC)版本,例如 MSVC 14.30
  • 工具集(Toolset)版本,例如 toolset 143
  • 编译器版本,例如 cl.exe 19.30

Visual Studio 版本

我相信大多数人首先看到的是 Visual Studio 的发布年份,因为 Microsoft 官方就是这么宣传的。例如你可以在官网下载页面看到 Visual Studio 2022、Visual Studio 2019 等等。

但其实 Visual Studio 的版本也有一个更加普遍的 major.minor 版本控制方案,主版本号会在每个发布年份递增。例如 VS 2010 是版本 10,VS 2017 是版本 15,VS 2019 是版本 16,VS 2022 是版本 17。所以,如果客户跟你说:“我用的是 15 版本”,那就意味着它是 Visual Studio 2017。

请注意,Visual Studio 版本的年份和主要版本之间没有任何关联,只是 Visual Studio 2010 恰好也是版本 10。

当然,除了主版本号,Visual Studio 还有次版本号。下表列出了目前主要版本的对应关系。

发布年份 实际版本号
Visual Studio 2017 15.0
  15.3
Visual Studio 2019 16.0
  16.1
Visual Studio 2022 17.0
  17.1

Visual C++ 版本

Microsoft Visual C++,又名 MSVC,虽然它作为 Visual Studio 的一部分跟随 Visual Studio 一同发布,但它也有自己的版本控制方案。值得一提的是,MSVC 的主版本号表示 ABI 兼容性,这意味着使用同一主版本号 MSVC 编译的东西可以与使用相同主版本号的任意其他 MSVC 编译的东西链接(有一些限制)。

幸运的是,MSVC 的主要版本号比 Visual Studio 版本本身更少被调整。到 Visual Studio 2022 为止,微软官方都将 MSVC 的主要版本保持在了 14,而次要版本的第一个数字似乎在每个主要版本的 Visual Studio 中都有所改变。

下表列出了 Visual Studio 和 MSVC 版本的对应关系。

发布年份 实际版本号 MSVC 版本
Visual Studio 2017 15.0 14.1
  15.3 14.11
Visual Studio 2019 16.0 14.20
  16.1 14.21
Visual Studio 2022 17.0 14.30
  17.1 14.31

链接器(link.exe)也使用 Visual C++ 版本号作为它的版本号。例如 Visual C++ 14.32,你可能会看到 link.exe 版本号为 14.32.31332.0

C++ 工具集版本

与 MSVC 版本号密切相关的是 C++ 工具集(toolset)版本号。从微软官方的文章来看,工具集版本似乎是由 MSVC 主要版本和 MSVC 次要版本的第一位数字组成。

我整理到下面表格,方便你能看出来它们之间的关系。

发布年份 实际版本号 MSVC 版本 工具集版本
Visual Studio 2017 15.0 14.1 141
  15.3 14.11 141
Visual Studio 2019 16.0 14.20 142
  16.1 14.21 142
Visual Studio 2022 17.0 14.30 143
  17.1 14.31 143

编译器版本

最后是编译器的版本,在这里特指 cl.exe 的版本,例如 19.16.27048。并且这个 major.minor 版本号与 _MSC_VER 宏定义相关联,这意味着你可以在源代码中检查它。例如,cl.exe 版本 19.21 对应的 _MSC_VER 宏为 1921。

你可以通过下面代码获取当前所使用的 Visual Studio 编译器的版本:

#include <iostream>

int main()
{
    std::cout << "Version: " << _MSC_VER << std::endl;
    return 0;
}

下表列出了 Visual Studio、MSVC、工具集以及编译器版本的对应关系。

发布年份 实际版本号 MSVC 版本 工具集版本 编译器版本
Visual Studio 2017 15.0 14.1 141 19.10
  15.3 14.11 141 19.11
Visual Studio 2019 16.0 14.20 142 19.20
  16.1 14.21 142 19.21
Visual Studio 2022 17.0 14.30 143 19.30
  17.1 14.31 143 19.31

基于此关系,你可以在源代码中通过 _MSC_VER 宏来区分不同版本,例如只有在足够新的 Visual Studio 编译环境下才编译某些东西,例如 #if _MSC_VER >= 1930

参考下面示例代码:

#include <iostream>

int main()
{
#if _MSC_VER >= 1930
    std::cout << "Visual Studio 2022" << std::endl;
#elif _MSC_VER >= 1920
    std::cout << "Visual Studio 2019" << std::endl;
#elif _MSC_VER >= 1910
    std::cout << "Visual Studio 2017" << std::endl;
#elif _MSC_VER >= 1900
    std::cout << "Visual Studio 2015" << std::endl;
#elif _MSC_VER >= 1800
    std::cout << "Visual Studio 2013" << std::endl;
#elif _MSC_VER >= 1700
    std::cout << "Visual Studio 2012" << std::endl;
#elif _MSC_VER >= 1600
    std::cout << "Visual Studio 2010" << std::endl;
#else
    std::cout << "Unknown Version" << std::endl;
#endif
    return 0;
}
  •  

小结

本文介绍了 Windows 集成开发环境 Visual Studio 令人混淆的版本号关系,横向对比了 MSVC、工具集以及编译器的版本号,并通过示例演示了如何在源代码中判断当前版本。希望对你有所帮助!