GNU सी ++ संकलक 1
जीएनयू सी ++ मैक्रो __cplusplus मानक अनुरूप है?
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
मोड मानक C++ जीसीसी के साथ
यह प्रिंट 1
, साथ ही C++ 0x मोड, gcc 4.3.4 के साथ, और जीसीसी 4.7.0 होने की __cplusplus
परिभाषित करने के लिए लगता है।
सी ++ 11 एफ डी आई "16.8 पूर्वनिर्धारित मैक्रो नाम [cpp.predefined]" में कहते हैं कि
नाम
__cplusplus
जब एक सी ++ अनुवाद इकाई संकलन मूल्य 201103L को परिभाषित किया गया है। (पाद-टिप्पणी: यह इरादा है कि इस मानक के भविष्य के संस्करणों एक अधिक से अधिक मूल्य के साथ इस मैक्रो का मान बदल देगा गैर अनुरूप कॉम pilers सबसे कम पांच दशमलव अंक के साथ एक मूल्य का उपयोग करना चाहिए।।)
पुराने std सी ++ 03 का एक समान नियम था।
क्या जीसीसी जानबूझकर इसे 1
पर सेट कर रहा है, क्योंकि यह "गैर-अनुरूप" है?
उस सूची के माध्यम से पढ़कर मैंने सोचा कि अगर मैं एक सी ++ 11 सक्षम कंपाइलर है तो पोर्टेबल तरीके से जांचने के लिए मैं __cplusplus
का उपयोग कर सकता हूं। लेकिन g ++ के साथ यह काम नहीं लगता है। मुझे ...EXPERIMENTAL...
मैक्रो के बारे में पता है, लेकिन उत्सुक हो गया है कि g ++ इस तरह __cplusplus
को परिभाषित कर रहा है।
मेरी मूल समस्या विभिन्न नल-पॉइंटर-वेरिएंट के बीच स्विच थी। कुछ इस तरह:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
वहाँ इस तरह के एक स्विच को लागू करने के लिए एक सरल और यथोचित पोर्टेबल तरीका है?
साइड ध्यान दें: मैं पूरी तरह से इस सूत्र नहीं पढ़ा है, लेकिन इस छ में एक बग ++ के रूप में स्वीकार किया गया था (10 साल पहले!) और 4.7.0 में तय किया गया है: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 – birryree
'#ifndef nullptr'' # परिभाषित करें nullptr NULL' 'endif' या 'ififf nullptr' '#Dfine MYNULL nullptr'' else' '# परिभाषित करें MYNULL NULL'' endif' –