it-swarm-id.com

Bagaimana cara mendeteksi jika saya sedang menyusun kode dengan versi Visual Studio tertentu?

Apakah ada cara untuk mengetahui apakah saya menyusun di bawah versi Microsoft Visual Studio tertentu?

253
Vhaerun

_MSC_VER dan mungkin _MSC_FULL_VER adalah yang Anda butuhkan. Anda juga dapat memeriksa visualc.hpp di sembarang peningkatan instal untuk beberapa contoh penggunaan.

Beberapa nilai untuk versi yang lebih baru dari kompiler adalah:

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)

Nomor versi di atas tentu saja mengacu pada versi utama dari studio Visual yang Anda lihat di kotak about, bukan ke tahun dalam namanya. Daftar yang lengkap dapat ditemukan di sini . Mulai baru-baru ini , Visual Studio akan mulai memperbarui rentangnya secara monoton, artinya Anda harus memeriksa rentang, daripada nilai kompilator yang tepat.

cl.exe /? akan memberikan petunjuk tentang versi yang digunakan, mis .:

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

Yap _MSC_VER adalah makro yang akan memberi Anda versi kompiler. Jumlah rilis Visual C++ terakhir adalah dalam bentuk <compiler-major-version>.00.<build-number>, di mana 00 adalah angka minor. Jadi _MSC_VER akan mengevaluasi menjadi <major-version><minor-version>.

Anda dapat menggunakan kode seperti ini:

#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

Tampaknya pembaruan antara rilis berturut-turut dari kompiler, belum mengubah compiler-minor-version, sehingga kode berikut ini tidak diperlukan:

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

Akses ke informasi versi yang lebih terperinci (seperti nomor kompiler build) dapat ditemukan menggunakan variabel pra-prosesor bawaan lainnya di sini .

43
display101

_MSC_VER harus didefinisikan ke nomor versi tertentu. Anda dapat # jika ada di dalamnya, atau Anda dapat menggunakan define yang sebenarnya dan melakukan tes runtime. (Jika karena alasan tertentu Anda ingin menjalankan kode yang berbeda berdasarkan pada kompiler yang dikompilasinya? Ya, mungkin Anda mencari #ifdef. :))

11
DJ Capelis

Dengan menggunakan makro _MSC_VER.

6
Jeff Hubbard

Sebagai jawaban yang lebih umum http://sourceforge.net/p/predef/wiki/Home/ memelihara daftar makro untuk mendeteksi kompiler khusus, sistem operasi, arsitektur, standar, dan banyak lagi.

3
Clifford

Ini agak lama tetapi harus membantu Anda memulai:

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