আমি কী কোনও নির্দিষ্ট ভিজ্যুয়াল স্টুডিওর সংস্করণ দিয়ে কোডটি সংকলন করছি তা কীভাবে সনাক্ত করবেন?


257

আমি কোনও নির্দিষ্ট মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও সংস্করণের অধীনে সংকলন করছি কিনা তা জানার কোনও উপায় আছে কি?

উত্তর:


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
দুঃখিত, তবে মাইক্রোসফ্ট এই তথ্যটি সহজে খুঁজে পাচ্ছে না কেন? এই পোস্টটি খুব দরকারী কিন্তু প্রয়োজন হবে না।
chrisw

6
দেখা যাচ্ছে যে এই ম্যাক্রোটি প্রকল্প দ্বারা ব্যবহৃত সংকলক সংস্করণকে প্রতিফলিত করে না। উদাহরণস্বরূপ, আপনি যদি প্রকল্পটি আপগ্রেড না করে কোনও নতুন সংস্করণে কোনও ভিএস 2010 প্রকল্পটি খোলেন তবে এই ম্যাক্রোটি ব্যবহৃত সংকলকটি প্রতিফলিত করে না - কেবল আইডিই সংস্করণ।
থমথম

আমি কিছু অন্যান্য লাইব্রেরির সাথে libFLAC সংকলনের প্রক্রিয়াধীন। তাদের সরঞ্জামসেট v100 ব্যবহার করে সংকলন করা দরকার। একটি কোড আছে #if defined _MSC_VER # if _MSC_VER >= 1800 # include <inttypes.h>। যদিও টাইপ করা যায় না। খুব অদ্ভুত
বার্নহার্ড ডাবলার

1
@ থমথম: এই ম্যাক্রোটি বিল্ড প্রকল্পের নির্বাচিত টার্গেট দ্বারা ব্যবহৃত টুলসেট সংস্করণটিকে হুবহু প্রতিফলিত করে। বা আরও স্বতন্ত্র: প্রকল্প-> বৈশিষ্ট্য-> সাধারণ-> প্ল্যাটফর্ম টুলসেট।
ইয়ামাকুজুরে

4
@ ক্রিসউ আমরা এখন এগুলি ডকুমেন্টস.মাইক্রোসফটকম / en-us / cpp / preprocessor /… এ নথিভুক্ত করেছি , দেখুন _MSC_VER । আশা করি এটি সহায়তা করে
সেবাস্তিয়ান

47

হ্যাঁ _MSC_VER হ'ল ম্যাক্রো যা আপনাকে সংকলক সংস্করণ দেবে। ভিজ্যুয়াল সি ++ এর প্রকাশের সর্বশেষ সংখ্যাটি ফর্মটিতে রয়েছে <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 করতে পারেন, বা আপনি প্রকৃত সংজ্ঞাটি ব্যবহার করতে পারেন এবং একটি রানটাইম পরীক্ষা করতে পারেন। (যদি কোনও কারণে আপনি কোন সংকলকটি সংকলিত হয়েছিল তার ভিত্তিতে আপনি আলাদা কোড চালনা করতে চেয়েছিলেন? হ্যাঁ, সম্ভবত আপনি # আইডিডিএফ খুঁজছিলেন। :))



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
@ জিমিমাডিসন: কেবলমাত্র এমএসসি_ভিয়ারের ক্ষেত্রেই এটি সত্য নয় যা একটি পূর্বনির্ধারিত ম্যাক্রো , এই উত্তরটি পরিষ্কারভাবে প্রশ্নের উত্তর দেয় না - এটি প্ল্যাটফর্মটি সনাক্ত করে, সংকলক সংস্করণ সংস্করণ নয়।
ক্লিফোর্ড 21

-11

ভিজ্যুয়াল স্টুডিওতে, সহায়তা করতে যান | ভিজ্যুয়াল স্টুডিওর যে সংস্করণটি আপনি আপনার অ্যাপ্লিকেশনটি সংকলন করতে ব্যবহার করছেন তা সম্পর্কে এবং দেখুন।


6
এটি গুরুতর হতে পারে না। বিশেষত এর মতো খ্যাতি সম্পন্ন কারও কাছ থেকে। আমি ধরে নিলাম আপনি শুধু কৌতুক করছেন?
বুভিনেজে

1
আমি মনে করি তিনি এই প্রশ্নের ব্যাখ্যা কেবল অন্যরকমভাবে করেছেন। সর্বোপরি, এটি প্রশ্নের প্রথম উত্তরগুলির মধ্যে একটি।
কিথ এম

4
আফাইক @ হ্যাকড বৈধ এবং সঠিক, কারণ প্রশ্নটিতে "আমার কোড থেকে" বা অন্য বিবৃতিটি অন্তর্ভুক্ত করা হয়নি যা জানিয়েছে যে সে ইতিমধ্যে কোনও ভিএস আইডিই ব্যবহার করছে না।
অ্যালেক্স বার্থ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.