it-swarm-vi.com

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ể?

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?

250
Vhaerun

_MSC_VER và có thể _MSC_FULL_VER là 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.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 phạm vi của nó một cách đơn điệu, nghĩa là bạn nên kiểm tra 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
.....
504
jilles de wit

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ì vậy, _MSC_VER sẽ đánh giá thành <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

Có thể tìm thấy quyền 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) bằng cách sử dụng các biến tiền xử lý dựng sẵn khác tại đây .

42
display101

_MSC_VER phải được xác định theo số phiên bản cụ thể. Bạn có thể #ifdef trên 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. :))

11
DJ Capelis

Bằng cách sử dụng macro _MSC_VER.

6
Jeff Hubbard

Như một câu trả lời tổng quát hơn http://sourceforge.net/p/predef/wiki/Home/ duy trì một danh sách các macro để phát hiện các trình biên dịch cụ thể, hệ điều hành, kiến ​​trúc, tiêu chuẩn và hơn thế nữa.

3
Clifford

Đ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
1
Rob Basler