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

257

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

Vhaerun
sumber

Jawaban:

516

_MSC_VERdan mungkin _MSC_FULL_VERitulah 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.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)

Nomor versi di atas tentu saja mengacu pada versi utama dari studio Visual Anda yang Anda lihat di kotak about, bukan ke tahun dalam namanya. Daftar 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, misalnya:

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
.....
jilles de wit
sumber
36
Maaf, tetapi mengapa Microsoft tidak membuat informasi ini mudah ditemukan? posting ini sangat berguna tetapi tidak diperlukan.
chrisw
6
Tampaknya makro ini tidak mencerminkan versi kompiler yang digunakan oleh proyek. Yaitu jika Anda membuka proyek VS2010 dalam versi yang lebih baru tanpa memutakhirkan proyek makro ini tidak mencerminkan kompiler yang digunakan - hanya versi IDE.
thomthom
Saya sedang dalam proses compilinf libFLAC bersama dengan beberapa perpustakaan lain. Mereka membutuhkan kompilasi yang harus dilakukan menggunakan toolset v100. Ada kodenya #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. inttypes.h tidak dapat ditemukan. Sangat aneh
Bernhard Döbler
1
@thomthom: Makro ini persis mencerminkan versi Toolset yang digunakan oleh target yang dipilih dari proyek build. Atau lebih berbeda: Project-> Properties-> General-> Platform Toolset.
Yamakuzure
4
@chrisw Kami sekarang mendokumentasikan ini di docs.microsoft.com/en-us/cpp/preprocessor/… , lihat _MSC_VER . Semoga ini bisa membantu
Sebastian
47

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_VERakan dievaluasi <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 dimodifikasi compiler-minor-version, jadi 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 .

display101
sumber
Anda hanya perlu memeriksa == 1500 dalam hal ini
José
@ José, benar kita bisa menyederhanakannya hanya dengan memeriksa VC ++ 9 dengan _MSC_VER_ == 1500, namun jika MS, memang memodifikasi _MSC_VERpembaruan dengan kompiler, paket layanan, dll (saya rasa mereka tidak pernah punya), maka == 1500cek bisa rusak. Itulah sebabnya saya mengkodekannya seperti itu.
display101
__MSC_VER mengevaluasi komponen nomor utama dan kecil dari versi kompiler. Ini tidak akan berubah dengan pembaruan, ada _MSC_FULL_VER dengan menyertakan nomor build juga, saya tidak perlu menggunakannya.
José
Saya akan memilih-up jawaban jika Anda mengeditnya untuk memperjelas ini. Bests Jose.
José
@ José: Jawaban diperbarui untuk memberikan jawaban yang lebih benar dan terperinci.
display101
11

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

DJ Capelis
sumber
7

Dengan menggunakan _MSC_VERmakro.

Jeff Hubbard
sumber
1

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
Steve Fallows
sumber
Saya suka jawaban ini jauh lebih banyak daripada yang terpilih. Karena _MSC_VER mengharuskan Anda memasukkan stdio.h
JMI MADISON
1
_MSC_VERtidak mengharuskan Anda untuk memasukkan stdio.h, yang dapat dengan mudah diujiecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth
1
@JMIMADISON: Tidak hanya itu tidak benar mengenai MSC_VER yang merupakan makro yang sudah ditentukan sebelumnya , jawaban ini jelas tidak menjawab pertanyaan - mendeteksi platform, bukan versi versi kompiler.
Clifford
-11

Di studio visual, buka bantuan | tentang dan lihat versi Visual Studio yang Anda gunakan untuk mengkompilasi aplikasi Anda.

Haacked
sumber
6
Ini tidak serius. Apalagi dari seseorang dengan reputasi seperti ini. Saya menganggap Anda hanya membuat lelucon?
BuvinJ
1
Saya pikir dia hanya menafsirkan pertanyaan dengan cara yang berbeda. Bagaimanapun, ini adalah salah satu jawaban pertama untuk pertanyaan itu.
Keith M
4
AFAIK @Haacked valid dan benar, karena pertanyaannya tidak termasuk "dari kode saya" atau pernyataan lain yang mengatakan bahwa dia belum menggunakan VS IDE.
Alex Byrth