সংকলক দ্বারা ব্যবহৃত সি ++ মানের সংস্করণটি কীভাবে নির্ধারণ করবেন?


114

আপনার সংকলক দ্বারা সি ++ মানের কোন সংস্করণটি প্রয়োগ করা হয় তা আপনি কীভাবে নির্ধারণ করবেন? আমি যতদূর জানি, নীচে আমি জানলাম যে মানগুলি:

  • সি ++ 03
  • সি ++ 98

3
আপনি এই সি ++ ট্যাগ করেছেন তবে আপনি তালিকাবদ্ধ তিনটি মানের দুটি সি ++ মান নয় not কোন ভাষা (গুলি) আপনি আগ্রহী?
রব কেনেডি

1
এবং প্রশ্নটি কয়েক মিনিট আগে জিজ্ঞাসা করা হয়েছিল। ( stackoverflow.com/questions/7132440/… )
মাদুর

1
@ ম্যাট: উত্থাপিত এবং বন্ধ হয়েছে কারণ প্রশ্নটি আবর্জনা ছিল এবং এটিতে অন্য কিছু নির্বিচারে বাজে কথা বলা হয়েছে gy আমি এটি একটি শালীন আকারে পুনরায় পোস্ট করেছি। আমি এটি বন্ধ করে খুশি হব যদি মনে হয় আসলটি স্থির হয়ে উঠবে এবং পুনরুদ্ধার হবে তবে আমি আমার নিঃশ্বাস ধরে রাখছি না।
অরবিটে লাইটনেস রেস

1
@ ম্যাট: ভাল, সর্বোত্তম উত্তরটি সংকলকগুলির স্থির তালিকা নয়, তবে কী কী ব্যবহার হচ্ছে তা নির্ধারণের একটি মাধ্যম । সুতরাং আপনি সেখানে যান।
অরবিটে লাইটনেস রেস

1
@ এলস: শীঘ্রই হবে। আমি কথা দিচ্ছি। এছাড়া c++-faqট্যাগ কোনো নেই প্রকৃত পূর্বশর্ত "সংখ্যা বার জিজ্ঞাসা করলেন," আপনি পাস করতে হবে; এটি জিনিসটির বিন্যাস এবং সাধারণতা সম্পর্কে আরও বেশি।
অরবিটে লাইটনেস রেস

উত্তর:


13

আমার জ্ঞান দ্বারা এটি করার কোনও সামগ্রিক উপায় নেই। আপনি যদি ক্রস প্ল্যাটফর্ম / একাধিক সংকলক সমর্থনকারী লাইব্রেরির শিরোনামগুলি দেখেন তবে আপনি সর্বদা প্রচুর সংজ্ঞা সংজ্ঞা পাবেন যা এই জাতীয় জিনিসগুলি নির্ধারণের জন্য সংকলক নির্দিষ্ট নির্মাণ ব্যবহার করে:

/*Define Microsoft Visual C++ .NET (32-bit) compiler */
#if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300)
     ...
#endif

/*Define Borland 5.0 C++ (16-bit) compiler */
#if defined(__BORLANDC__) && !defined(__WIN32__)
     ...
#endif

আপনার ব্যবহৃত সমস্ত সংকলকগুলির জন্য আপনাকে সম্ভবত নিজেকে সংজ্ঞায়িত করতে হবে।


1
যদিও আমার প্রত্যাশিত উত্তর নয় তবে আমার ধারণা এটির সন্ধানের কোনও সর্বজনীন উপায় নেই।
জেসনলাইন

246

বাজার্ন স্ট্রস্ট্রপ সি ++ 0 এক্স এফএকিউ :

__cplusplus

সি ++ 0 এক্সে ম্যাক্রো __cplusplusএকটি মানকে সেট করা হবে যা বর্তমানের চেয়ে পৃথক (এর চেয়ে বড়) 199711L

যদিও এটি যেমনটি চান তেমন সহায়ক নয়। gcc(দৃশ্যত প্রায় 10 বছর ধরে) এই মানটি সেট করা ছিল 1, একটি বড় সংকলককে বাতিল করে দিয়েছিল, যতক্ষণ না এটি জিসিসি ৪.7.০ প্রকাশের সময় নির্ধারিত হয়

এগুলি হ'ল সি ++ স্ট্যান্ডার্ড এবং কোন মানটি আপনার কাছে আশা করতে সক্ষম হওয়া উচিত __cplusplus:

  • সি ++ প্রাক-সি ++ 98: __cplusplusহয় 1
  • সি ++ 98: __cplusplusহয় 199711L
  • সি ++ 98 + টিআর 1: এটি সি ++ 98 হিসাবে পড়ে এবং আমি জানি এটি চেক করার কোনও উপায় নেই।
  • সি ++ 11: __cplusplusহয় 201103L
  • সি ++ 14: __cplusplusহয় 201402L
  • সি ++ 17: __cplusplusহয় 201703L

যদি সংকলকটি আরও পুরানো হতে পারে তবে gccআমাদের নির্দিষ্ট হ্যাকারি সংকলন করতে হবে (একটি সংস্করণ ম্যাক্রোটি দেখুন, এটি প্রয়োগিত বৈশিষ্ট্যযুক্ত একটি টেবিলের সাথে তুলনা করুন) বা বুস্ট.কনফিগ (যা প্রাসঙ্গিক ম্যাক্রোগুলি সরবরাহ করে ) ব্যবহার করুন। এর সুবিধাটি হ'ল আমরা প্রকৃতপক্ষে নতুন স্ট্যান্ডার্ডের নির্দিষ্ট বৈশিষ্ট্যগুলি চয়ন করতে পারি, এবং বৈশিষ্ট্যটি অনুপস্থিত থাকলে একটি কর্মপদ্ধতি লিখতে পারি। এটি প্রায়শই হোলসেল সলিউশনের তুলনায় বেশি পছন্দ করা হয়, কারণ কিছু সংকলক সি ++ 11 বাস্তবায়নের দাবি করবেন তবে কেবলমাত্র বৈশিষ্ট্যগুলির একটি উপসেট অফার করবেন।

Stdcxx উইকি সি ++ 0x বৈশিষ্ট্যগুলির সংকলক সমর্থনের জন্য একটি বিস্তৃত ম্যাট্রিক্স হোস্ট করে (যদি আপনি নিজে বৈশিষ্ট্যগুলি খতিয়ে দেখার সাহস করেন)।

দুর্ভাগ্যক্রমে, বৈশিষ্ট্যগুলির জন্য আরও সূক্ষ্ম-পরীক্ষাযুক্ত পরীক্ষা করা (যেমন পৃথক লাইব্রেরির ফাংশনগুলি std::copy_if) কেবলমাত্র আপনার অ্যাপ্লিকেশনটির বিল্ড সিস্টেমে করা যেতে পারে (বৈশিষ্ট্যটির সাথে চালানো কোড, এটি পরীক্ষা করে সঠিক ফলাফল তৈরি করেছে কিনা তা যাচাই করে নিন - autoconfযদি গ্রহণ করা হয় তবে পছন্দের সরঞ্জাম এই রুট)।


কম্পাইলার বিক্রেতাদের মনে হচ্ছে না এই আপডেট করছি - তারা হয়তো যতক্ষণ না তারা সম্পূর্ণরূপে মান সাথে সামঞ্জস্য অপেক্ষা করছি ( stackoverflow.com/q/14131454/11698 )
রিচার্ড Corden

2
@ প্রনর: এটি সত্য হতে পারে তবে কোন উত্তরটি গ্রহণ করা উচিত তা সিদ্ধান্ত নেওয়ার জন্য প্রশ্নটি জিজ্ঞাসা করা ব্যবহারকারীদের উপর নির্ভর করবে। যে উত্তরটি বর্তমানে গৃহীত হিসাবে চিহ্নিত করা হয়েছে তা পোস্ট করা হয়েছিল, সঠিক ছিল, তাই মূল পোস্টার এটি গ্রহণ করেছে। এই ব্যবহারকারী গ্রহণযোগ্য উত্তর পরিবর্তন করার সিদ্ধান্ত নিতে পারে, তবে তারা আর সাইটে সক্রিয় হতে পারে না। দেখুন: মেটা.স্ট্যাকেক্সেঞ্জিং
ড্যান কর্ন

3
vs2017 __cplusplus এর মান 199711 দেয়
আল মামুন

5
@ আলমামুন মাইক্রোসফ্ট আংশিকভাবে __cplusplusকেবল ভিএস 15.7 এ স্থির হয়েছে । তাদের ভিজ্যুয়াল সি ++ টিম ব্লগ দেখুন
ইভান_বেরেজিউক

1
FAQ- এর লিঙ্কটি নষ্ট হয়ে গেছে।
ব্রেইনপ্লট

38

দয়া করে, সংস্করণটি পরীক্ষা করতে নিম্নলিখিত কোডটি চালান run

#include<iostream>

int main() {
    if (__cplusplus == 201703L) std::cout << "C++17\n";
    else if (__cplusplus == 201402L) std::cout << "C++14\n";
    else if (__cplusplus == 201103L) std::cout << "C++11\n";
    else if (__cplusplus == 199711L) std::cout << "C++98\n";
    else std::cout << "pre-standard C++\n";
}

8
এটি মজার, কারণ ভিজ্যুয়াল স্টুডিওতে __cplusplus এর মান 199711L এবং আপনি যে কোডটি পোস্ট করেছেন তা সি ++ 98 রিটার্ন করেছে, আমি ভেরিয়েবল টেম্পলেট এবং ডিক্লাইপ (অটো) সহ সি ++ 14 এর বৈশিষ্ট্যগুলি ব্যবহার করেছি। ম্যাক্রোর ভুল সংস্করণটি কার্যকর করা সম্ভব?
কলিন হিক্স

2
: দেখুন devblogs.microsoft.com/cppblog/... : (পতাকা উল্লেখ TLDR /Zc:__cplusplus)
Daan Timmer

@ দানটাইমার আমি এই নিবন্ধটি দ্বারা বিভ্রান্ত হয়ে পড়েছি, /Zc:__cplusplusপতাকাটি কীভাবে ব্যবহার করতে হবে তা জ্ঞান ধরেছে বলে মনে হয় । আমি সহজেই পারছি না std::cout << /Zc:__cplusplus;কারণ কোলন এবং স্ল্যাশ অবশ্যই চলক নামের অংশ হতে পারে না। আপনি কীভাবে এটি করবেন তা ব্যাখ্যা করতে সক্ষম? ধন্যবাদ।
এ__

এটি খুঁজে পেয়েছে
en-

7

আপনি কী অর্জন করতে চান তার উপর নির্ভর করে বুস্ট.কনফিগ আপনাকে সহায়তা করতে পারে। এটি স্ট্যান্ডার্ড-সংস্করণ সনাক্তকরণ সরবরাহ করে না, তবে এটি ম্যাক্রোগুলি সরবরাহ করে যা আপনাকে নির্দিষ্ট ভাষা / সংকলক-বৈশিষ্ট্যগুলির সমর্থনের জন্য পরীক্ষা করতে দেয়।


3
বৈশিষ্ট্যগুলি পরীক্ষা করা সম্ভবত স্ট্যান্ডার্ড সংস্করণগুলি যাচাই করার চেয়ে ভাল ধারণা। কয়েক কম্পাইলার সমর্থন সবকিছু একটি প্রমিত থেকে, কিন্তু যদি তারা সব সমর্থন বৈশিষ্ট্য সীমিত সংখ্যক আপনার যা দরকার, তাহলে এটি সত্যিই কোন ব্যাপার না কিনা একটি প্রদত্ত মান থেকে বৈশিষ্ট্যগুলি বাকি বাস্তবায়িত এবং সঠিকভাবে কাজ করছে না।
রব কেনেডি



0

দ্রুত গুগলের পরে :

__STDC__এবং __STDC_VERSION__, এখানে দেখুন


কিনা __STDC__সংজ্ঞায়িত করা হয়, এবং কি এর মান হয়, বাস্তবায়ন-সংজ্ঞায়িত সি হয় ++,।
রব কেনেডি

@ রব: হ্যাঁ, তাই। @ টোর: আমি ভিসি ++ 2005 এ চেষ্টা করেছি তবে এটি বলছে যে এসটিডিসি একটি অঘোষিত শনাক্তকারী। এটি যদিও সেই পূর্বনির্ধারিত ম্যাক্রোগুলির মধ্যে একটি হিসাবে তালিকাভুক্ত। যাইহোক, এসটিডিসি_ভিসার্শন বিদ্যমান নেই।
জেসনলাইন

এটি আপনাকে সংকলক দ্বারা সমর্থিত সি প্রোগ্রামিং ভাষার সংস্করণ জানায়। এটি আপনাকে সমর্থিত সি ++ ভাষার সংস্করণ সম্পর্কে কিছুই বলবে না।
ড্যান মোল্ডিং

0

সাধারণত আপনার __cplusplusসি ++ 17 সনাক্ত করতে ডিফাইন ব্যবহার করা উচিত , তবে ডিফল্টভাবে মাইক্রোসফ্ট সংকলক সেই ম্যাক্রোটি সঠিকভাবে সংজ্ঞায়িত করে না, দেখুন https: //devblogs.mic Microsoft.com/cppblog/msvc-now-correctly-report-__cplusplus/ - আপনার প্রয়োজন হয় /Zc:__cplusplusসুইচ অন্তর্ভুক্ত করতে প্রকল্প সেটিংস সংশোধন করতে, বা আপনি এর মতো সিনট্যাক্স ব্যবহার করতে পারেন:

#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
     //C++17 specific stuff here
#endif
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.