如何检测我是否正在使用特定的Visual Studio版本编译代码?


257

有没有办法知道我是否在特定的Microsoft Visual Studio版本下进行编译?

Answers:


516

_MSC_VER可能_MSC_FULL_VER就是您所需要的。您还可以在任何最新的boost安装中查看visualc.hpp,以获得一些用法示例。

最新版本的编译器的一些值是:

MSVC++ 14.24 _MSC_VER == 1924 (Visual Studio 2019 version 16.4)
MSVC++ 14.23 _MSC_VER == 1923 (Visual Studio 2019 version 16.3)
MSVC++ 14.22 _MSC_VER == 1922 (Visual Studio 2019 version 16.2)
MSVC++ 14.21 _MSC_VER == 1921 (Visual Studio 2019 version 16.1)
MSVC++ 14.2  _MSC_VER == 1920 (Visual Studio 2019 version 16.0)
MSVC++ 14.16 _MSC_VER == 1916 (Visual Studio 2017 version 15.9)
MSVC++ 14.15 _MSC_VER == 1915 (Visual Studio 2017 version 15.8)
MSVC++ 14.14 _MSC_VER == 1914 (Visual Studio 2017 version 15.7)
MSVC++ 14.13 _MSC_VER == 1913 (Visual Studio 2017 version 15.6)
MSVC++ 14.12 _MSC_VER == 1912 (Visual Studio 2017 version 15.5)
MSVC++ 14.11 _MSC_VER == 1911 (Visual Studio 2017 version 15.3)
MSVC++ 14.1  _MSC_VER == 1910 (Visual Studio 2017 version 15.0)
MSVC++ 14.0  _MSC_VER == 1900 (Visual Studio 2015 version 14.0)
MSVC++ 12.0  _MSC_VER == 1800 (Visual Studio 2013 version 12.0)
MSVC++ 11.0  _MSC_VER == 1700 (Visual Studio 2012 version 11.0)
MSVC++ 10.0  _MSC_VER == 1600 (Visual Studio 2010 version 10.0)
MSVC++ 9.0   _MSC_FULL_VER == 150030729 (Visual Studio 2008, SP1)
MSVC++ 9.0   _MSC_VER == 1500 (Visual Studio 2008 version 9.0)
MSVC++ 8.0   _MSC_VER == 1400 (Visual Studio 2005 version 8.0)
MSVC++ 7.1   _MSC_VER == 1310 (Visual Studio .NET 2003 version 7.1)
MSVC++ 7.0   _MSC_VER == 1300 (Visual Studio .NET 2002 version 7.0)
MSVC++ 6.0   _MSC_VER == 1200 (Visual Studio 6.0 version 6.0)
MSVC++ 5.0   _MSC_VER == 1100 (Visual Studio 97 version 5.0)

上面的版本号当然是指您在“关于”框中看到的Visual Studio的主要版本,而不是名称中的年份。完整的列表可以在这里找到。从最近开始,Visual Studio将开始单调更新其范围,这意味着您应该检查范围,而不是确切的编译器值。

cl.exe /? 将提示使用的版本,例如:

c:\program files (x86)\microsoft visual studio 11.0\vc\bin>cl /?
Microsoft (R) C/C++ Optimizing Compiler Version 17.00.50727.1 for x86
.....

36
抱歉,但是Microsoft为什么不使这些信息易于查找?这篇文章非常有用,但不是必须的。
克里斯(Chrisw)2015年

6
看来此宏不能反映项目使用的编译器版本。即,如果您以较新版本打开VS2010项目而不升级项目,则此宏不会反映所使用的编译器-仅反映IDE版本。
thomthom '16

我正在与其他一些库一起编译libFLAC。他们要求使用工具集v100进行编译。有一个密码#if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>。但是找不到inttypes.h。非常奇怪
BernhardDöbler'16

1
@thomthom:该宏完全反​​映了构建项目的选定目标所使用的工具集版本。或更独特的项目:项目->属性->常规->平台工具集。
Yamakuzure

4
@chrisw我们现在在docs.microsoft.com/en-us/cpp/preprocessor/…上对此文档进行了说明,请参阅_MSC_VER 。希望这会
Sebastian

47

是的_MSC_VER是将为您提供编译器版本的宏。Visual C ++的最后发行版本的格式为<compiler-major-version>.00.<build-number>,其中00是次要版本号。因此_MSC_VER将评估为<major-version><minor-version>

您可以使用如下代码:

#if (_MSC_VER == 1500)
   // ... Do VC9/Visual Studio 2008 specific stuff
#elif (_MSC_VER == 1600)
   // ... Do VC10/Visual Studio 2010 specific stuff
#elif (_MSC_VER == 1700)
   // ... Do VC11/Visual Studio 2012 specific stuff
#endif

似乎在编译器的后续发行版之间进行了更新,尚未修改compiler-minor-version,因此不需要以下代码:

#if (_MSC_VER >= 1500 && _MSC_VER <= 1600)
   // ... Do VC9/Visual Studio 2008 specific stuff
#endif

可以使用其他内置的预处理器变量来访问更详细的版本信息(例如,编译器内部版本号) 此处来


你只需要在这种情况下,检查== 1500
何塞

@José,是的,我们可以简化为仅使用来检查VC ++ 9 _MSC_VER_ == 1500,但是如果MS确实_MSC_VER使用编译器更新,Service Pack等(我认为他们没有)修改了,则== 1500检查可能会失败。这就是为什么我用这种方式编码。
display101 2013年

__MSC_VER评估编译器版本的主要和次要组成部分。这不会随着更新而改变,还有_MSC_FULL_VER也包含内部版本号,我从来不需要使用它。
何塞

如果您对此答案进行澄清,我将对其进行投票。最好的何塞。
何塞

@José:答案已更新,可以给出更正确和详细的答案。
2013年

11

_MSC_VER应该定义为特定的版本号。您可以在其上#ifdef,也可以使用实际的定义并进行运行时测试。(如果由于某种原因您想基于使用哪个编译器运行不同的代码?是的,可能您正在寻找#ifdef。:)




1

这有点旧,但应该可以帮助您入门:

//******************************************************************************
// Automated platform detection
//******************************************************************************

// _WIN32 is used by
// Visual C++
#ifdef _WIN32
#define __NT__
#endif

// Define __MAC__ platform indicator
#ifdef macintosh
#define __MAC__
#endif

// Define __OSX__ platform indicator
#ifdef __APPLE__
#define __OSX__
#endif

// Define __WIN16__ platform indicator 
#ifdef _Windows_
#ifndef __NT__
#define __WIN16__
#endif
#endif

// Define Windows CE platform indicator
#ifdef WIN32_PLATFORM_HPCPRO
#define __WINCE__
#endif

#if (_WIN32_WCE == 300) // for Pocket PC
#define __POCKETPC__
#define __WINCE__
//#if (_WIN32_WCE == 211) // for Palm-size PC 2.11 (Wyvern)
//#if (_WIN32_WCE == 201) // for Palm-size PC 2.01 (Gryphon)  
//#ifdef WIN32_PLATFORM_HPC2000 // for H/PC 2000 (Galileo)
#endif

我最喜欢这个答案,而不是票数最高的那个。因为_MSC_VER要求您包括stdio.h
JMI MADISON

1
_MSC_VER不要求你有stdio.h,可以很容易地测试echo int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
凯文·史密斯

1
@JMIMADISON:对于_predefined宏MSC_VER而言,不仅不正确,而且此答案显然不能回答问题-它检测平台,而不是编译器版本。
克利福德,

-11

在Visual Studio中,寻求帮助| 关于并查看用于编译应用程序的Visual Studio版本。


6
这不能是严重的。特别是来自这样的声誉的人。我想你只是在开玩笑吗?
BuvinJ

1
我认为他只是以不同的方式解释了这个问题。毕竟,这是该问题的第一个答案。
基思M

4
AFAIK @Haacked是有效和正确的,因为问题不包括“来自我的代码”或其他说明他/她尚未使用VS IDE的语句。
亚历克斯·伯斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.