আমি সি ++ 11 সমর্থন কীভাবে চেক করব?


104

সংকলকটি সি ++ 11 এর নির্দিষ্ট বৈশিষ্ট্যগুলি সমর্থন করে তবে কি সংকলন সময়ে সনাক্ত করার কোনও উপায় আছে? উদাহরণস্বরূপ, এর মতো কিছু:

#ifndef VARIADIC_TEMPLATES_SUPPORTED

#error "Your compiler doesn't support variadic templates.  :("

#else

template <typename... DatatypeList>
class Tuple
{
    // ...
}

#endif

2
আপনার কাছে "assert_variadic_template_support.hpp" নামে একটি শিরোনাম থাকতে পারে যা আপনি অন্তর্ভুক্ত করতে পারেন এবং এর মধ্যে কিছু পছন্দ করতে পারেন template <typename... Test> struct compiler_must_support_variadic_templates;। একটি সিনট্যাক্স ত্রুটি দ্রুত সমস্যাটি প্রকাশ করবে। (ঠিক একদিকে যেমন সঠিক ত্রুটির বার্তা আরও ভাল))
GManNickG

এই সমস্যাটি সমাধানের 'ডান' উপায়টি একটি কনফিগার টেস্ট।
জোসেফ গারভিন

উত্তর:


125

সেখানে নামে একজন ধ্রুবক __cplusplusযে সি ++ কম্পাইলার সি সংস্করণ সেট করা উচিত ++ স্ট্যান্ডার্ডের সমর্থিত এই দেখতে

#if __cplusplus <= 199711L
  #error This library needs at least a C++11 compliant compiler
#endif

এটি ভিজ্যুয়াল স্টুডিও 2010 এসপি 1 তে 199711L তে সেট করা হয়েছে, তবে আমি জানি না যে বিক্রেতারা যদি ইতিমধ্যে সমস্ত সি ++ 11 পরিবর্তন সহ একটি স্ট্যান্ডার্ড সি ++ গ্রন্থাগার বনাম কম্পাইলার স্তরের সমর্থন (আংশিক) থাকে তবে তারা এটি ইতিমধ্যে বাড়ানোর ক্ষেত্রে এত সাহসী হবে কিনা তা আমি জানি না I ।

সুতরাং বুস্টের অন্য উত্তরে উল্লিখিত সংজ্ঞাগুলি হ'ল উদাহরণস্বরূপ, সি ++ 11 থ্রেড এবং স্ট্যান্ডার্ডের অন্যান্য নির্দিষ্ট অংশগুলির জন্য সমর্থন আছে কিনা তা সনাক্ত করার একমাত্র বুদ্ধিমান উপায় remain


37
সি ++ 11 সেট মান __cplusplusথেকে 201103L। এটি ২০১১ স্ট্যান্ডার্ডের সাথে পুরো কনফারেন্সের জোর দেয়; এটি আপনাকে আংশিক ধারণা বা সংকলক এক্সটেনশান সম্পর্কে বলে না tell যদি __cplusplusসেট করা থাকে 201103L, তবে হয় সংকলক সম্পূর্ণরূপে মেনে চলে অথবা এটি আপনার কাছে মিথ্যা। যদি এটি না হয় তবে আপনি কোন বৈশিষ্ট্যটি সমর্থন করছেন তা সত্যই আপনি বলতে পারবেন না।
কিথ থম্পসন

1
g ++ 4.7.x (এবং সম্ভবত আরও নতুন) -std=c++11বিকল্পটি নির্দিষ্ট করা হলে (এটিও হতে পারে ) সেট করে -std=gnu++11। তারা এটি পুরোপুরি বৈশিষ্ট্যযুক্ত না হওয়া সত্ত্বেও এটি করে (4.8 আমাদের অনেক কাছে নিয়ে আসে)। দ্রষ্টব্য - সংকলকটি কী সমর্থন করে এবং স্ট্যান্ডার্ড লাইব্রেরিতে যা পাওয়া যায় তার মধ্যে একটি ব্যবধান রয়েছে। 4.7.x এবং 4.8.x উভয়ই বর্তমানে রেগেক্স সমর্থন হারিয়েছে - তবে এটি একটি লাইব্রেরি, সংকলক বৈশিষ্ট্য নয়।
নাথন আর্নস্ট

1
আমি কেন জানি এটি গৃহীত উত্তর নয়? এছাড়াও, আপনি আপনার উত্তরটি আরও উন্নত করতে এই পরামর্শটি ব্যবহার করতে পারেন , এটি খুব ভাল।
ইহরব আল আসিমি

1
@KeithThompson আমার জন্য, উভয় কোড :: ব্লক এবং ভিসুয়াল স্টুডিও মান সেট __cplusplusকরার 199711Lজন্য সি ++ 11.
ডোনাল্ড ডাক

3
@ ডোনাল্ডডাক: কড়া কথা বলছেন, না, তারা করেন না। একটি সংকলক সেট __cplusplusকরে 199711Lযা একটি উপযুক্ত সি ++ 11 সংকলক নয়। তাদের সম্ভবত সঠিকভাবে আচরণ করার বিকল্প রয়েছে।
কিথ থম্পসন

39

সি ++ 11 স্ট্যান্ডার্ড (আইসো.16.8) দ্বারা বর্ণিত হিসাবে :

নাম __cplusplus মান সংজ্ঞায়িত করা হয় 201103L যখন একটি সি ++ অনুবাদ ইউনিট সংকলন।

সেই ম্যাক্রোর মান সহ, আপনি কম্পাইলারটি সি ++ 11 অনুবর্তী কিনা তা পরীক্ষা করতে পারেন।

এখন, আপনি যদি সংকলক সি ++ 11 বৈশিষ্ট্যের যে কোনও উপসেটটি সমর্থন করে কিনা তা পরীক্ষা করার জন্য কোনও স্ট্যান্ডার্ড উপায়ের সন্ধান করছেন, আমি মনে করি কোনও মানক, বহনযোগ্য উপায় নেই; আরও তথ্য পেতে আপনি সংকলক ডকুমেন্টেশন বা স্টাডি লাইব্রেরির শিরোনাম ফাইলগুলি পরীক্ষা করতে পারেন।


2
উদাহরণস্বরূপ, স্ট্যাটিক_সেটরটি ভিএস 2010 এবং সমস্ত সি ++ 11 কপিলারগুলিতে সমর্থিত। সুতরাং, আপনি যদি ভিএস2010 (যেমন> = 199711L) এর সেট থেকে __cplsplus এর মান বৃহত্তর বা সমান পরীক্ষা করেন তবে আপনি ভাল হতে পারেন।
পাওলো এম

33

আমি জানি যে এটি একটি খুব পুরানো প্রশ্ন, তবে এই প্রশ্নটি প্রায়শই দেখা যায় এবং উত্তরগুলি কিছুটা পুরানো।

সি ++ 14 স্ট্যান্ডার্ড সহ আরও নতুন সংকলকগুলির C ++ 11 বৈশিষ্ট্য সহ বৈশিষ্ট্যগুলি চেক করার একটি স্ট্যান্ডার্ড পদ্ধতি রয়েছে। একটি বিস্তৃত পৃষ্ঠাটি https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-rec सिफारिशগুলিতে রয়েছে

সংক্ষেপে, প্রতিটি বৈশিষ্ট্যের একটি মানক ম্যাক্রো সংজ্ঞায়িত থাকে যা আপনি চেক করতে পারেন #ifdef। উদাহরণস্বরূপ, ব্যবহারকারীর সংজ্ঞায়িত আক্ষরিক জন্য পরীক্ষা করতে, আপনি ব্যবহার করতে পারেন

#ifdef __cpp_user_defined_literals

1
আমি এটা জানতাম না। আমি মনে করি যে এই সাধারণ বৈশিষ্ট্যটি দেরিতে আসছে, তবে তবুও খুব কার্যকর হতে পারে, বিশেষত __has_include()ম্যাক্রো।
প্রপিন

22

চেক সহায়তার জন্য সি ++ 14 এবং অন্যান্য। জিসিসি 5.2.1 তে পরীক্ষা করা।

#include <iostream>

int main(){
        #if __cplusplus==201402L
        std::cout << "C++14" << std::endl;
        #elif __cplusplus==201103L
        std::cout << "C++11" << std::endl;
        #else
        std::cout << "C++" << std::endl;
        #endif

        return 0;
}

17

আপনি এটি ব্যবহার করতে পারেন:

#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)
    cout << "C++11 is supported";
#else
    cout << "C++11 is not supported";
#endif

সি ++ ১১-এর জন্য, ভিজ্যুয়াল স্টুডিও বাদে বেশিরভাগ সংকলক __cplusplusম্যাক্রো সেট করে তবে ভিজ্যুয়াল স্টুডিওর যে 201103Lকোনও সংস্করণ সেট করে 199711Lযেটি সি ++ 11 এর আগে অন্যান্য সংকলকগুলির জন্য ব্যবহৃত মান। এই কোডটি ভিজ্যুয়াল স্টুডিও ব্যতীত সমস্ত সংকলকগুলির _cplusplusসাথে ম্যাক্রোর সাথে তুলনা করে এবং সংকলকটি 201103Lভিজ্যুয়াল স্টুডিও হয় তবে এটি ভিজ্যুয়াল স্টুডিওর সংস্করণ ২০১৫-এর পরে আছে কিনা তা যাচাই করে, ভিজ্যুয়াল স্টুডিওর প্রথম সংস্করণ যা পুরোপুরি সি ++ 11 সমর্থন করে (ভিজ্যুয়ালের জন্য) স্টুডিও 2015, _MSC_VERম্যাক্রোর মান রয়েছে 1900, এই উত্তরটি দেখুন )।


1
এই উত্তরটি ভুল। জন্য g++ -std=c++98জিসিসি 4.8 সঙ্গে, এটা ভুল ছাপে C++11 is supported
পিটিএস

1
@pts দুঃখিত, একটি টাইপো। এটা এখন সংশোধন করা উচিত।
ডোনাল্ড হাঁস

7

আপনি যদি বুস্ট.কনফিগ ব্যবহার করতে না চান এবং সি ++ 11 সমর্থনকারী সংকলকগুলির জন্য পরীক্ষা করতে চান তবে ধ্রুবকের মান পরীক্ষা করে তা __cplusplusকরবে। যাইহোক, একটি সংকলক সি ++ 11 স্ট্যান্ডার্ডের বেশিরভাগ জনপ্রিয় বৈশিষ্ট্যগুলিকে সমর্থন করতে পারে তবে এটি সম্পূর্ণ নির্দিষ্টকরণগুলিকে সমর্থন করে না। আপনি যদি সুনির্দিষ্ট ভিজ্যুয়াল স্টুডিও সংকলকগুলির জন্য সমর্থন সক্ষম করতে চান যা এখনও সি ++ 11 নির্দিষ্টকরণের সাথে 100% অনুগত নয় তবে নিম্নলিখিত কোড স্নিপেট ব্যবহার করুন যা ভিজ্যুয়াল স্টুডিও 2013 তে সংকলন করার অনুমতি দেয়:

#if defined(_MSC_VER)
#   if _MSC_VER < 1800 
#       error This project needs atleast Visual Studio 2013
#   endif
#elif __cplusplus <= 199711L
#   error This project can only be compiled with a compiler that supports C++11
#endif

আমি ভিজ্যুয়াল স্টুডিও ২০০৮ এর সাথে কোডটি সংকলন করছি কিনা তা সনাক্ত করতে কীভাবে ভিজুয়াল স্টুডিওর জন্য সংকলকের সংস্করণগুলির একটি সম্পূর্ণ তালিকা সরবরাহ করা হয়েছে


6

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


2
হ্যাঁ অটোকনফ বৈশিষ্ট্যগুলির জন্য পরীক্ষা করতে ব্যবহার করা যেতে পারে তবে এটি আপনাকে অবশ্যই এটির ব্যর্থতা বা সাফল্যের জন্য উপযুক্ত ম্যাক্রো তৈরি করতে হবে যা উপরের কোড দ্বারা পরীক্ষা করা যেতে পারে। সুতরাং নিজেই এই উত্তরটি কোনও তথ্য যোগ করে না।
মার্টিন ইয়র্ক

3
@ লোকিস্টারি: অটোকনফ কীভাবে কাজ করে তা তা নয়। অটোকনফ ম্যাক্রোগুলি সরবরাহ করে যা আপনার কনফিগার স্ক্রিপ্টকে একটি পরীক্ষা উত্স ফাইলটি সংকলন করতে দেয় এবং সংকলনের সাফল্যের উপর ভিত্তি করে # ডিফাইন 0 বা 1 তে সেট করে। ডাইভার্সকুবা ২৩-এর উত্তরটি ওপળીটি আসল সমস্যার উপশমী সমাধানের জন্য পৌঁছেছে তা নির্দেশ করে তথ্য সরবরাহ করে।
জোসেফ গারভিন


1

যখন আপনার চেকটি সি ++ 11 লাইব্রেরির উপলব্ধতার জন্য হয় (কোনও ভাষা বৈশিষ্ট্য নয়), উদাহরণস্বরূপ <array>শিরোনাম, আপনি এটি করতে পারেন #if __has_include(<array>)

কখনও কখনও চেক #if __cplusplus >= 201103L আপনাকে বলতে পারে যে আপনি সি ++ 11 ব্যবহার করেন তবে এক্সকোডের স্ট্যান্ডার্ড লাইব্রেরি সংস্করণ সেটিং এর মতো অন্যান্য সেটিংসগুলিতে এখনও নতুন লাইব্রেরি উপলব্ধ না থাকতে পারে (তাদের বেশিরভাগই বিভিন্ন নামে পাওয়া যায় যেমন <tr1/array>)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.