Làm cách nào để phát hiện nếu tôi đang biên dịch mã với một phiên bản Visual Studio cụ thể?


257

Có cách nào để biết nếu tôi biên dịch theo phiên bản Microsoft Visual Studio cụ thể không?

Câu trả lời:


516

_MSC_VERvà có thể _MSC_FULL_VERlà những gì bạn cần. Bạn cũng có thể kiểm tra visualc.hpp trong bất kỳ cài đặt boost nào gần đây cho một số ví dụ sử dụng.

Một số giá trị cho các phiên bản mới hơn của trình biên dịch là:

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)

Số phiên bản ở trên tất nhiên đề cập đến phiên bản chính của Visual studio mà bạn nhìn thấy trong hộp giới thiệu, không phải là năm trong tên. Một danh sách kỹ lưỡng có thể được tìm thấy ở đây . Bắt đầu gần đây , Visual Studio sẽ bắt đầu cập nhật các phạm vi của nó một cách đơn điệu, có nghĩa là bạn nên kiểm tra các phạm vi, thay vì các giá trị trình biên dịch chính xác.

cl.exe /? sẽ đưa ra gợi ý về phiên bản đã sử dụng, ví dụ:

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
Xin lỗi, nhưng tại sao Microsoft không làm cho thông tin này dễ tìm? bài đăng này rất hữu ích nhưng không nên yêu cầu.
chrisw

6
Dường như macro này không phản ánh phiên bản trình biên dịch được sử dụng bởi dự án. Tức là nếu bạn mở một dự án VS2010 trong phiên bản mới hơn mà không nâng cấp dự án thì macro này không phản ánh trình biên dịch đang được sử dụng - chỉ có phiên bản IDE.
thomthom

Tôi đang trong quá trình biên dịch libFLAC cùng với một số thư viện khác. Họ yêu cầu biên dịch được thực hiện bằng cách sử dụng bộ công cụ v100. Có một mã số #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. inttypes.h không thể được tìm thấy, mặc dù. Rất lạ
Bernhard Döbler

1
@thomthom: Macro này phản ánh chính xác phiên bản Toolet được sử dụng bởi mục tiêu đã chọn của dự án xây dựng. Hoặc khác biệt hơn: Project-> Properties-> General-> Platform Toolset.
Yamakuzure

4
@chrisw Bây giờ chúng tôi ghi lại tài liệu này tại docs.microsoft.com/en-us/cpp/pre Processor / 21 , xem _MSC_VER . Hy vọng điều này sẽ giúp
Sebastian

47

Yep _MSC_VER là macro sẽ giúp bạn có phiên bản trình biên dịch. Số bản phát hành cuối cùng của Visual C ++ có dạng <compiler-major-version>.00.<build-number>, trong đó 00 là số phụ. Vậy _MSC_VERsẽ đánh giá <major-version><minor-version>.

Bạn có thể sử dụng mã như thế này:

#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

Nó xuất hiện các bản cập nhật giữa các bản phát hành liên tiếp của trình biên dịch, chưa sửa đổi compiler-minor-version, do đó không cần phải có đoạn mã sau:

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

Truy cập vào thông tin phiên bản chi tiết hơn (như số bản dựng trình biên dịch) có thể được tìm thấy bằng cách sử dụng các biến tiền xử lý dựng sẵn khác tại đây .


bạn chỉ cần kiểm tra == 1500 trong trường hợp đó
José

@ José, đúng là chúng ta có thể đơn giản hóa nó chỉ để kiểm tra VC ++ 9 _MSC_VER_ == 1500, tuy nhiên nếu MS, đã sửa đổi các _MSC_VERbản cập nhật trình biên dịch, gói dịch vụ, v.v. (Tôi không nghĩ là chúng có), thì == 1500kiểm tra có thể bị hỏng. Đó là lý do tại sao tôi đã mã hóa nó theo cách đó.
101

__MSC_VER đánh giá các thành phần số chính và số phụ của phiên bản trình biên dịch. Điều này sẽ không thay đổi với bản cập nhật, có _MSC_FULL_VER bao gồm cả số bản dựng, tôi không bao giờ cần phải sử dụng nó.
Jose

Tôi sẽ bình chọn câu trả lời nếu bạn chỉnh sửa nó để làm rõ điều này. Tốt nhất Jose.
Jose

@ José: Trả lời cập nhật để đưa ra câu trả lời chính xác và chi tiết hơn.
101

11

_MSC_VER phải được xác định theo số phiên bản cụ thể. Bạn có thể #ifdef trên đó hoặc bạn có thể sử dụng định nghĩa thực tế và thực hiện kiểm tra thời gian chạy. (Nếu vì lý do nào đó bạn muốn chạy mã khác nhau dựa trên trình biên dịch được biên dịch với? Yeah, có lẽ bạn đang tìm kiếm #ifdef. :))




1

Điều này hơi cũ nhưng sẽ giúp bạn bắt đầu:

//******************************************************************************
// 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

Tôi thích câu trả lời này hơn rất nhiều so với câu trả lời hàng đầu. Bởi vì _MSC_VER yêu cầu bạn bao gồm stdio.h
JMI MADISON

1
_MSC_VERkhông yêu cầu bạn đưa vào stdio.h, có thể dễ dàng kiểm traecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth

1
@JMIMADISON: Không chỉ không đúng về MSC_VER là macro được xác định rõ ràng, câu trả lời này rõ ràng không trả lời câu hỏi - nó phát hiện nền tảng, không phải phiên bản phiên bản trình biên dịch.
Clifford

-11

Trong phòng thu trực quan, hãy giúp đỡ | về và xem xét phiên bản Visual Studio mà bạn đang sử dụng để biên dịch ứng dụng của mình.


6
Điều này không thể nghiêm trọng. Đặc biệt là từ một người có danh tiếng như thế này. Tôi cho rằng bạn chỉ đang làm một trò đùa?
BuvinJ

1
Tôi nghĩ anh ấy chỉ diễn giải câu hỏi theo một cách khác. Rốt cuộc, đây là một trong những câu trả lời đầu tiên cho câu hỏi.
Keith M

4
AFAIK @Haacked là hợp lệ và chính xác, vì câu hỏi không bao gồm "từ mã của tôi" hoặc tuyên bố khác nói rằng anh ấy / cô ấy chưa sử dụng VS IDE.
Alex Byrth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.