यदि मैं एक विशेष विज़ुअल स्टूडियो संस्करण के साथ कोड संकलित कर रहा हूं तो कैसे पता लगाएं?


257

क्या यह जानने का कोई तरीका है कि क्या मैं किसी विशिष्ट Microsoft Visual Studio संस्करण के अंतर्गत संकलन कर रहा हूँ?

जवाबों:


516

_MSC_VERऔर संभवतः _MSC_FULL_VERवही है जो आपको चाहिए। आप कुछ उपयोग उदाहरणों के लिए किसी भी हाल के बूस्ट इंस्‍टॉल में दृश्‍यमान की जांच कर सकते हैं।

संकलक के अधिक हाल के संस्करणों के लिए कुछ मूल्य हैं:

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)

संस्करण के ऊपर संस्करण संख्या आपके विज़ुअल स्टूडियो के प्रमुख संस्करण को संदर्भित करती है जिसे आप बॉक्स में देखते हैं, नाम में वर्ष तक नहीं। एक पूरी सूची यहां पाई जा सकती हैहाल ही में शुरू होने पर , विजुअल स्टूडियो अपनी सीमाओं को नीरस रूप से अपडेट करना शुरू कर देगा, जिसका अर्थ है कि आपको सटीक कंपाइलर मानों के बजाय श्रेणियों की जांच करनी चाहिए।

cl.exe /? उपयोग किए गए संस्करण का एक संकेत देगा, उदाहरण के लिए:

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
क्षमा करें, लेकिन Microsoft ने इस जानकारी को ढूंढना आसान क्यों नहीं बनाया? यह पोस्ट बहुत उपयोगी है, लेकिन इसकी आवश्यकता नहीं होनी चाहिए।
क्रिस

6
ऐसा प्रतीत होता है कि यह मैक्रो प्रोजेक्ट द्वारा उपयोग किए गए संकलक संस्करण को प्रतिबिंबित नहीं करता है। यानी यदि आप इस प्रोजेक्ट को अपग्रेड किए बिना नए संस्करण में VS2010 प्रोजेक्ट खोलते हैं तो यह मैक्रो उपयोग किए जा रहे कंपाइलर को प्रतिबिंबित नहीं करता है - केवल आईडी कार्ड संस्करण।
थोमथोम

मैं कुछ अन्य पुस्तकालयों के साथ मिलकर libFLAC संकलन की प्रक्रिया में हूँ। उन्हें टूलसेट v100 का उपयोग करके संकलन की आवश्यकता होती है। एक कोड है #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>। inttypes.h नहीं पाया जा सकता है, यद्यपि। बहुत अजीब
बर्नहार्ड डब्लर

1
@thomthom: यह मैक्रो बिल्ट प्रोजेक्ट के चयनित लक्ष्य द्वारा उपयोग किए जाने वाले टूलसेट संस्करण को दर्शाता है। या अधिक विशिष्ट: प्रोजेक्ट-> गुण-> सामान्य-> प्लेटफ़ॉर्म टूलसेट।
यमकुजुरे

4
@chrisw हम अब भी इस दस्तावेज़ को docs.microsoft.com/en-us/cpp/preprocessor/... , देखें _MSC_VER । आशा है कि यह मदद करता है
सेबस्टियन

47

हां _MSC_VER मैक्रो है जो आपको संकलक संस्करण मिलेगा। विज़ुअल C ++ की रिलीज़ की अंतिम संख्या फॉर्म की है <compiler-major-version>.00.<build-number>, जहां 00 मामूली संख्या है। इसलिए _MSC_VERमूल्यांकन करेगा <major-version><minor-version>

आप इस तरह कोड का उपयोग कर सकते हैं:

#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

यह कंपाइलर के क्रमिक रिलीज के बीच अपडेट दिखाई देता है, इसे संशोधित नहीं किया है compiler-minor-version, इसलिए निम्न कोड की आवश्यकता नहीं है:

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

अधिक विस्तृत संस्करण जानकारी (जैसे कि कंपाइलर बिल्ड नंबर) तक पहुंच अन्य बिल्ट प्री-प्रोसेसर वेरिएबल्स का उपयोग करके पाई जा सकती है


आपको बस उस मामले में == 1500 की जांच करने की आवश्यकता है
जोस

@ जोस, सच है कि हम इसे केवल वीसी ++ 9 के लिए जांचने के लिए सरल बना सकते हैं _MSC_VER_ == 1500, लेकिन यदि एमएस ने _MSC_VERसंकलक अपडेट, सर्विस पैक, आदि के साथ संशोधित किया (मुझे नहीं लगता कि उनके पास कभी है), तो == 1500चेक टूट सकता है। यही वजह है कि मैंने इसे इस तरह कोडित किया है।
डिस्प्ले101

__MSC_VER संकलक के संस्करण के प्रमुख और लघु संख्या घटकों का मूल्यांकन करता है। यह अपडेट के साथ नहीं बदलेगा, बिल्ड नंबर को शामिल करने के साथ _MSC_FULL_VER है, मुझे इसका उपयोग करने की कभी आवश्यकता नहीं है।
जोस

यदि आप इसे स्पष्ट करने के लिए इसे संपादित करते हैं तो मैं उत्तर को वोट करूंगा। कीट जोस।
जोस

@ जोस: अधिक सही और विस्तृत उत्तर देने के लिए अपडेट किया गया उत्तर।
डिस्प्ले101

11

_MSC_VER को एक विशिष्ट संस्करण संख्या में परिभाषित किया जाना चाहिए। आप या तो इस पर #ifdef कर सकते हैं, या आप वास्तविक परिभाषित का उपयोग कर सकते हैं और एक रनटाइम टेस्ट कर सकते हैं। (यदि किसी कारण से आप अलग-अलग कोड चलाना चाहते थे तो किस कंपाइलर के आधार पर इसे संकलित किया गया? हाँ, शायद आप #ifdef की तलाश में थे। :)



4

अधिक सामान्य उत्तर के रूप में, http://sourceforge.net/p/predef/wiki/Home/ विशिष्ट संकलक, ऑपरेटिंग सिस्टम, आर्किटेक्चर, मानकों और अधिक का पता लगाने के लिए मैक्रो की एक सूची रखता है।


1

यह थोड़ा पुराना है लेकिन आपको इसकी शुरुआत करनी चाहिए:

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

मुझे यह उत्तर बहुत पसंद है कि शीर्ष ने एक वोट दिया। क्योंकि _MSC_VER के लिए आवश्यक है कि आप stdio.h
JMI MADISON

1
_MSC_VERआपको शामिल करने की आवश्यकता नहीं है stdio.h, जिसे आसानी से परीक्षण किया जा सकता हैecho int i = _MSC_VER; > tmp.c cl /nologo /c tmp.c
केविन स्माइथ

1
@JMIMADISON: न केवल MSC_VER के बारे में सच है, जो कि _predefined मैक्रो है , यह उत्तर स्पष्ट रूप से प्रश्न का उत्तर नहीं देता है - यह प्लेटफ़ॉर्म का पता लगाता है, संकलक संस्करण संस्करण नहीं।
क्लिफोर्ड

-11

दृश्य स्टूडियो में, मदद के लिए जाओ | के बारे में और Visual Studio के संस्करण को देखें जो आप अपने ऐप को संकलित करने के लिए उपयोग कर रहे हैं।


6
यह गंभीर नहीं हो सकता। खासतौर पर किसी के साथ इस तरह की प्रतिष्ठा से। मुझे लगता है कि तुम सिर्फ मजाक बना रहे थे?
बुविविज

1
मुझे लगता है कि उन्होंने सिर्फ एक अलग तरीके से प्रश्न की व्याख्या की। आखिरकार, यह सवाल के पहले उत्तरों में से एक है।
कीथ एम

4
AFAIK @Haacked वैध और सही है, क्योंकि प्रश्न में "मेरे कोड से" या अन्य कथन शामिल नहीं है जो बताता है कि वह / वह पहले से ही एक वीएस आईडीई का उपयोग नहीं कर रहा है।
एलेक्स बर्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.