【问题标题】:How to Detect if I'm Compiling Code with a particular Visual Studio version?如何检测我是否正在使用特定的 Visual Studio 版本编译代码?
【发布时间】:2010-09-09 08:37:54
【问题描述】:

有什么方法可以知道我是否在特定的 Microsoft Visual Studio 版本下编译?

【问题讨论】:

    标签: c++ visual-studio


    【解决方案1】:

    _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)
    

    上面的版本号当然是指您在 about 框中看到的 Visual Studio 的主要版本,而不是名称中的年份。完整列表可以在here 找到。 Starting recently,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
    .....
    

    【讨论】:

    • 抱歉,为什么 Microsoft 不让这些信息易于查找?这篇文章非常有用,但不应该是必需的。
    • 这个宏似乎没有反映项目使用的编译器版本。 IE。如果您在未升级项目的情况下以较新版本打开 VS2010 项目,则此宏不会反映正在使用的编译器 - 仅反映 IDE 版本。
    • 我正在与其他一些库一起编译 libFLAC。它们需要使用工具集 v100 进行编译。有一个代码#if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>。但是,找不到 inttypes.h。很奇怪
    • @thomthom :此宏准确反映了构建项目的选定目标使用的工具集版本。或更明确:项目->属性->常规->平台工具集。
    • @chrisw 我们现在将其记录在docs.microsoft.com/en-us/cpp/preprocessor/…,请参阅_MSC_VER 。希望这会有所帮助
    【解决方案2】:

    是的 _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
    

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

    【讨论】:

    • 在这种情况下你只需要检查 == 1500
    • @José,确实我们可以将其简化为仅使用 _MSC_VER_ == 1500 检查 VC++ 9,但是如果 MS 确实使用编译器更新、服务包等修改了 _MSC_VER(我不认为他们曾经有过),那么== 1500 检查可能会中断。这就是我这样编码的原因。
    • __MSC_VER 评估编译器版本的主要和次要数字组件。这不会随着更新而改变,_MSC_FULL_VER 也包含内部版本号,我从来不需要使用它。
    • 如果您编辑答案以澄清这一点,我会投票赞成。最好的何塞。
    • @José:已更新答案以提供更正确和详细的答案。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      通过使用_MSC_VER 宏。

      【讨论】:

        【解决方案5】:

        作为更一般的答案,http://sourceforge.net/p/predef/wiki/Home/ 维护了一个宏列表,用于检测特定的编译器、操作系统、架构、标准等。

        【讨论】:

          【解决方案6】:

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

          //******************************************************************************
          // 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
          • _MSC_VER 不需要你包含stdio.h,可以很容易地测试echo int i = _MSC_VER; &gt; tmp.c cl /nologo /c tmp.c
          • @JMIMADISON :关于 MSC_VER 这是一个_predefined宏不仅不是真的,这个答案显然没有回答这个问题 - 它检测的是平台,而不是编译器版本版本。
          【解决方案7】:

          在visual studio中,去帮助|了解并查看您用于编译应用的 Visual Studio 版本。

          【讨论】:

          • 这不严重。尤其是来自有这样名声的人。我猜你只是在开玩笑?
          • 我认为他只是以不同的方式解释了这个问题。毕竟,这是问题的第一个答案。
          • AFAIK @Haacked 是有效且正确的,因为该问题不包括“来自我的代码”或其他说明他/她尚未使用 VS IDE 的声明。
          猜你喜欢
          • 1970-01-01
          • 2014-06-08
          • 2021-12-27
          • 1970-01-01
          • 2014-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多