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

279

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

7个回答

541

_MSC_VER和可能的_MSC_FULL_VER是你需要的。你还可以查看任何最新的Boost安装中的visualc.hpp,以获取一些使用示例。

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

MSVC++ 14.30 _MSC_VER == 1933 (Visual Studio 2022 version 17.3.4)
MSVC++ 14.30 _MSC_VER == 1932 (Visual Studio 2022 version 17.2.2)
MSVC++ 14.30 _MSC_VER == 1930 (Visual Studio 2022 version 17.0.2)
MSVC++ 14.30 _MSC_VER == 1930 (Visual Studio 2022 version 17.0.1)
MSVC++ 14.28 _MSC_VER == 1929 (Visual Studio 2019 version 16.11.2)
MSVC++ 14.28 _MSC_VER == 1928 (Visual Studio 2019 version 16.9.2)
MSVC++ 14.28 _MSC_VER == 1928 (Visual Studio 2019 version 16.8.2)
MSVC++ 14.28 _MSC_VER == 1928 (Visual Studio 2019 version 16.8.1)
MSVC++ 14.27 _MSC_VER == 1927 (Visual Studio 2019 version 16.7)
MSVC++ 14.26 _MSC_VER == 1926 (Visual Studio 2019 version 16.6.2)
MSVC++ 14.25 _MSC_VER == 1925 (Visual Studio 2019 version 16.5.1)
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将开始单调更新其范围,这意味着您应该检查范围而不是精确的编译器值。从最近开始,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
.....

44
抱歉,为什么微软不把这些信息弄得容易找到呢?虽然这篇帖子很有用,但应该不需要这样才能找到。 - chrisw
10
看起来这个宏并不能反映该项目所使用的编译器版本。也就是说,如果你在更新的版本中打开一个未升级的VS2010项目,这个宏只会反映IDE的版本,而不是正在使用的编译器版本。 - thomthom
1
我正在编译libFLAC和其他一些库。它们要求使用toolset v100进行编译。有一个代码`#if defined _MSC_VER

if _MSC_VER >= 1800

include <inttypes.h>`。然而,无法找到inttypes.h文件。非常奇怪。

- Bernhard Döbler
你提供的链接声称VS 2017是MSVC++版本15.0,但你的回答声称它是MSVC++ 14.1。哪一个是正确的? - Pharap
2
@thomthom:这个宏精确地反映了构建项目所选目标使用的工具集版本。或者更明确地说:项目->属性->常规->平台工具集。 - Yamakuzure
9
我们现在将此记录在https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017上,参见```_MSC_VER```。希望这可以帮到你。 - Sebastian

51

是的,_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é
@José,确实我们可以简化它,只需检查 _MSC_VER_ == 1500 是否为 VC++ 9即可。但是,如果微软在编译器更新、服务包等方面修改了 _MSC_VER(我认为他们从未这样做过),那么 == 1500 的检查可能会出现问题。这就是为什么我以这种方式编码的原因。 - display101
MSC_VER 评估编译器版本的主要和次要号码组件。这个不会随更新而改变,有_MSC_FULL_VER 包括构建号码,但我从未需要使用它。 - José
如果您能编辑回答以澄清此问题,我将会给它点赞。最好的祝福,Jose。 - José
@José:回答已更新,提供了更正确和详细的答案。 - display101

11

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


7
通过使用_MSC_VER宏。

4

2
这可能有点老了,但应该可以帮助你入门:
//******************************************************************************
// 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。 - KANJICODER
2
_MSC_VER does not require you to include stdio.h, which can be easily tested echo int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c - Kevin Smyth
2
@J.M.I.MADISON:关于_MSC_VER这个预定义宏,这不仅是不正确的说法,而且这个答案显然没有回答问题——它检测的是平台,而不是编译器版本。 - Clifford

-10
在 Visual Studio 中,转到帮助 | 关于,查看您正在使用的 Visual Studio 版本来编译您的应用程序。

7
这不可能是认真的。尤其是来自声誉如此的人。我猜你只是在开玩笑? - BuvinJ
2
我认为他只是以不同的方式解释了这个问题。毕竟,这是对这个问题的最初回答之一。 - Keith M
8
据我所知,@Haacked 的回答是正确的和合理的,因为问题中没有包含“从我的代码中”或其他表明他/她还没有使用VS IDE的陈述。 - Alex Byrth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接