Belirli bir Visual Studio sürümü ile kod derleme olup olmadığını nasıl tespit edebilirim?


257

Belirli bir Microsoft Visual Studio sürümü altında derleyip derlemediğimi bilmenin bir yolu var mı?

Yanıtlar:


516

_MSC_VERve muhtemelen _MSC_FULL_VERihtiyacınız olan şey budur. Ayrıca, visualc.hpp dosyasını herhangi bir yeni yükleme kurulumunda bazı kullanım örnekleri için inceleyebilirsiniz.

Derleyicinin daha yeni sürümleri için bazı değerler:

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)

Elbette yukarıdaki sürüm numarası, Visual Studio'nuzun adında geçen yıla değil, yaklaşık kutusunda gördüğünüz ana sürümüne karşılık gelir. Ayrıntılı bir liste burada bulunabilir . Son zamanlarda , Visual Studio aralıklarını monoton olarak güncellemeye başlayacaktır, yani tam derleyici değerleri yerine aralıkları kontrol etmeniz gerekir.

cl.exe /? kullanılan sürümle ilgili bir ipucu verecektir, örneğin:

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
Maalesef Microsoft neden bu bilgileri bulmayı kolaylaştırmıyor? bu gönderi çok faydalıdır, ancak zorunlu değildir.
chrisw

6
Bu makronun proje tarafından kullanılan derleyici sürümünü yansıtmadığı anlaşılmaktadır. Yani projeyi yükseltmeden daha yeni bir sürümde bir VS2010 projesini açarsanız, bu makro kullanılan derleyiciyi yansıtmaz - sadece IDE sürümü.
thomthom

Diğer kütüphanelerle birlikte libFLAC derleme sürecindeyim. Derleme v100 araç seti kullanılarak yapılmalıdır. Bir kod var #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>. inttypes.h bulunamıyor. Very strange
Bernhard Döbler

1
@thomthom: Bu makro, derleme projesinin seçilen hedefi tarafından kullanılan Araç Seti sürümünü tam olarak yansıtır. Veya daha belirgin: Proje-> Özellikler-> Genel-> Platform Araç Seti.
Yamakuzure

4
@chrisw Şimdi bunu docs.microsoft.com/en-us/cpp/preprocessor/… adresinde belgeliyoruz , bkz _MSC_VER . Umarım bu yardımcı olur
Sebastian

47

Evet _MSC_VER, derleyici sürümünü alacak olan makrodur. Visual C ++ 'nın son sürüm sayısı, <compiler-major-version>.00.<build-number>00'ın küçük sayı olduğu biçimdedir . Böylece _MSC_VERdeğerlendirir <major-version><minor-version>.

Bunun gibi bir kod kullanabilirsiniz:

#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

Derleyicinin birbirini izleyen sürümleri arasında güncellemeler var, değiştirilmemiş compiler-minor-version, bu nedenle aşağıdaki kod gerekli değildir:

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

Daha ayrıntılı sürüm bilgilerine (derleyici derleme numarası gibi) erişim, burada diğer yerleşik ön işlemci değişkenleri kullanılarak bulunabilir .


bu durumda == 1500'ü kontrol etmeniz yeterlidir
José

@ José, doğru biz sadece VC ++ 9 ile kontrol etmek için basitleştirmek olabilir _MSC_VER_ == 1500, ancak MS, _MSC_VERderleyici güncelleştirmeleri, hizmet paketleri, vb (değiştirdiler sanmıyorum) ile değişiklik yaptıysanız , o zaman == 1500kontrol kırılabilir. Bu yüzden bu şekilde kodladım.
display101

__MSC_VER, derleyici sürümünün ana ve küçük sayı bileşenlerini değerlendirir. Bu bir güncelleme ile değişmez, orada inşa numarası da dahil _MSC_FULL_VER, bunu kullanmak zorunda asla.
José

Bunu açıklığa kavuşturmak için düzenlerseniz cevabı yükseltirim. En İyiler Jose.
José

@ José: Yanıt daha doğru ve ayrıntılı bir cevap vermek için güncellendi.
display101

11

_MSC_VER belirli bir sürüm numarası olarak tanımlanmalıdır. #İfdef yazabilir veya gerçek tanımla ve bir çalışma zamanı testi yapabilirsiniz. (Herhangi bir nedenden dolayı derlendiği derleyiciye göre farklı kodlar çalıştırmak isteseydiniz? Evet, muhtemelen # ifdef'i arıyordunuz. :))




1

Bu biraz eskidir ama başlamanız gerekir:

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

Bu cevabı en çok oy alandan çok daha fazla beğendim. _MSC_VER, stdio.h
JMI MADISON

1
_MSC_VERstdio.hkolayca test edilebilir dahil etmenizi gerektirmezecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
Kevin Smyth

1
@JMIMADISON: _predefined bir makro olan MSC_VER ile ilgili sadece doğru değil , bu cevap açıkça soruyu cevaplamıyor - derleyici sürümü sürümünü değil platformu algılıyor.
Clifford

-11

Visual studio'da yardıma gidin | hakkında bilgi edinin ve uygulamanızı derlemek için kullandığınız Visual Studio sürümüne bakın.


6
Bu ciddi olamaz. Özellikle böyle bir üne sahip birinden. Sanýrým sadece ţaka yaptýn?
BuvinJ

1
Soruyu farklı bir şekilde yorumladığını düşünüyorum. Sonuçta, bu sorunun ilk cevaplarından biridir.
Keith M

4
AFAIK @Haacked geçerli ve doğrudur, çünkü soru "kodumdan" veya zaten bir VS IDE kullanmadığını söyleyen başka bir ifade içermez.
Alex Byrth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.