संकलक द्वारा प्रयुक्त C ++ मानक के संस्करण का निर्धारण कैसे करें?


114

आप यह कैसे निर्धारित करते हैं कि आपके संकलक द्वारा C ++ मानक का कौन सा संस्करण लागू किया गया है? जहां तक ​​मुझे पता है, नीचे दिए गए मानक हैं:

  • सी ++ 03
  • सी ++ 98

3
आपने इस c ++ को टैग किया है , लेकिन आपके द्वारा सूचीबद्ध तीन मानकों में से दो C ++ मानक नहीं हैं। आप किस भाषा (भाषाओं) में रुचि रखते हैं?
रोब कैनेडी

1
और सवाल सिर्फ एक-दो मिनट पहले पूछा गया है। ( stackoverflow.com/questions/7132440/… )
Mat

1
@Mat: प्रश्न को बकवास और बंद कर दिया गया था क्योंकि उस पर कुछ अन्य मनमानी बकवास सूअर का बच्चा था। मैंने इसे एक सभ्य रूप में फिर से पोस्ट किया है। मुझे यह बंद करने में खुशी होगी अगर ऐसा लगता है कि मूल को ठीक किया जाएगा और पुनर्जीवित किया जाएगा, लेकिन मैं अपनी सांस नहीं रोक रहा हूं।
को ऑर्बिट

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

Bjarne Stroustrup से C ++ 0x पूछे जाने वाले प्रश्न :

__cplusplus

C ++ 0x में मैक्रो __cplusplusको ऐसे मान पर सेट किया जाएगा जो वर्तमान से अलग (से अधिक है) 199711L

हालांकि यह उतना उपयोगी नहीं है जितना कोई चाहेगा। gcc(स्पष्ट रूप से लगभग 10 वर्षों के लिए) यह मान निर्धारित किया गया था 1, एक प्रमुख संकलक को सत्तारूढ़ करने के लिए , जब तक कि यह तय नहीं किया गया था जब gcc 4.7.0 निकला था

ये C ++ मानक हैं और आप किस मूल्य में उम्मीद कर सकते हैं __cplusplus:

  • सी ++ प्री-सी ++ 98: __cplusplusहै 1
  • C ++ 98: __cplusplusहै 199711L
  • C ++ 98 + TR1: यह C ++ 98 के रूप में पढ़ता है और यह जांचने का कोई तरीका नहीं है कि मुझे पता है।
  • C ++ 11: __cplusplusहै 201103L
  • C ++ 14: __cplusplusहै 201402L
  • C ++ 17: __cplusplusहै 201703L

यदि कंपाइलर पुराना हो सकता है gcc, तो हमें कंपाइलर विशिष्ट हैकरी का सहारा लेना होगा (संस्करण मैक्रो को देखें, इसे कार्यान्वित सुविधाओं वाली तालिका से तुलना करें) या Boost.Config (जो प्रासंगिक मैक्रो प्रदान करता है) का उपयोग करें । इसका लाभ यह है कि हम वास्तव में नए मानक की विशिष्ट विशेषताओं को चुन सकते हैं, और यदि सुविधा गायब है तो वर्कअराउंड लिखें। यह अक्सर एक थोक समाधान पर पसंद किया जाता है, क्योंकि कुछ संकलक C ++ 11 को लागू करने का दावा करेंगे, लेकिन केवल सुविधाओं का सबसेट प्रस्तुत करते हैं।

Stdcxx Wiki C ++ 0x सुविधाओं के कंपाइलर समर्थन के लिए एक व्यापक मैट्रिक्स होस्ट करता है (यदि आप स्वयं सुविधाओं की जांच करने की हिम्मत करते हैं)।

दुर्भाग्य से, सुविधाओं के लिए और अधिक सूक्ष्मता से जाँच करना (जैसे व्यक्तिगत पुस्तकालय कार्य जैसे std::copy_if) केवल आपके आवेदन की निर्माण प्रणाली में किया जा सकता है (सुविधा के साथ रन कोड, जांचें कि क्या यह संकलित और सही परिणाम उत्पन्न autoconfकरता है - यदि ले रहा है तो विकल्प का उपकरण है यह मार्ग)।


संकलक विक्रेताओं की तरह नहीं दिखता इस अद्यतन कर रहे हैं - शायद वे जब तक वे पूरी तरह से मानक के अनुरूप प्रतीक्षा कर रहे हैं ( stackoverflow.com/q/14131454/11698 )
रिचर्ड कॉर्दन

2
@prnr: यह सच हो सकता है, लेकिन यह उस उपयोगकर्ता पर निर्भर है जिसने यह सवाल पूछा है कि कौन सा उत्तर स्वीकार करना है। उस समय जो उत्तर वर्तमान में स्वीकृत के रूप में चिह्नित किया गया था, वह सही था, इसलिए मूल पोस्टर ने इसे स्वीकार कर लिया। वह उपयोगकर्ता स्वीकृत उत्तर को बदलने का निर्णय ले सकता है, लेकिन वे अब साइट पर सक्रिय नहीं हो सकते हैं। देखें: meta.stackexchange.com/questions/120568/…
Dan Korn

3
vs2017 __cplusplus का मूल्य 199711
अल मामुन

5
@AlMamun Microsoft आंशिक रूप से __cplusplusकेवल VS 15.7 में तय किया गया है। उनका विजुअल C ++ टीम ब्लॉग देखें
इवान_एयरज़ीक

1
एफएक्यू का लिंक टूट गया है।
ब्रेनप्लॉट

38

कृपया, संस्करण की जाँच करने के लिए निम्नलिखित कोड चलाएँ।

#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
इसका मजाकिया, क्योंकि दृश्य स्टूडियो पर pluscplusplus का मान 199711L है और आपके द्वारा पोस्ट किया गया कोड c ++ 98 हालांकि वापस आ गया है, लेकिन मैंने c ++ 14 से वैरिएबल टेम्प्लेट और डिक्लेपट (ऑटो) सहित सुविधाओं का उपयोग किया है। क्या यह संभव है कि मैक्रो का गलत संस्करण लागू किया गया था?
कॉलिन हिक्स

2
देखें: devblogs.microsoft.com/cppblog/… (TLDR: ध्वज निर्दिष्ट करें /Zc:__cplusplus)
Daan Timmer

@DaanTimmer मैं उस लेख से भ्रमित हूं, यह /Zc:__cplusplusध्वज का उपयोग करने के तरीके के बारे में ज्ञान ग्रहण करता है । मैं बस std::cout << /Zc:__cplusplus;इसलिए नहीं कर सकता क्योंकि कॉलन और स्लैश, निश्चित रूप से चर नामों का हिस्सा नहीं हो सकते। क्या आप यह समझाने में सक्षम हैं कि यह कैसे करना है? धन्यवाद।
A__


7

आप जो हासिल करना चाहते हैं, उसके आधार पर Boost.Config आपकी मदद कर सकता है। यह मानक-संस्करण का पता लगाने की सुविधा प्रदान नहीं करता है, लेकिन यह मैक्रोज़ प्रदान करता है जो आपको विशिष्ट भाषा / संकलक-सुविधाओं के समर्थन के लिए जाँच करते हैं।


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



0

एक त्वरित Google के बाद :

__STDC__और __STDC_VERSION__, यहां देखें


क्या __STDC__परिभाषित किया गया है, और इसका मूल्य क्या है, C ++ में कार्यान्वयन-परिभाषित हैं।
रोब कैनेडी

@ रोब: हाँ, यह है। @ इसके लिए: मैंने वीसी ++ 2005 में कोशिश की, लेकिन यह कहता है कि एसटीडीसी एक अघोषित पहचानकर्ता है। हालांकि यह उन पूर्व-निर्धारित मैक्रोज़ में से एक के रूप में सूचीबद्ध है। हालाँकि, STDC_VERSION मौजूद नहीं है।
jasonline

यह आपको संकलक द्वारा समर्थित C प्रोग्रामिंग भाषा का संस्करण बताता है। यह आपको C ++ भाषा के संस्करण के बारे में कुछ नहीं बताता है जो समर्थित है।
डैन मोल्डिंग

0

आम तौर पर आपको __cplusplusc ++ 17 का पता लगाने के लिए परिभाषित का उपयोग करना चाहिए , लेकिन डिफ़ॉल्ट रूप से Microsoft कंपाइलर उस मैक्रो को ठीक से परिभाषित नहीं करता है, https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus - देखें /Zc:__cplusplusस्विच को शामिल करने के लिए या तो परियोजना सेटिंग्स को संशोधित करें, या आप इस तरह से सिंटैक्स का उपयोग कर सकते हैं:

#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
     //C++17 specific stuff here
#endif
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.