2011-09-23 11 views
30

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 

वहाँ इस तरह के एक स्विच को लागू करने के लिए एक सरल और यथोचित पोर्टेबल तरीका है?

+13

साइड ध्यान दें: मैं पूरी तरह से इस सूत्र नहीं पढ़ा है, लेकिन इस छ में एक बग ++ के रूप में स्वीकार किया गया था (10 साल पहले!) और 4.7.0 में तय किया गया है: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 – birryree

+0

'#ifndef nullptr'' # परिभाषित करें nullptr NULL' 'endif' या 'ififf nullptr' '#Dfine MYNULL nullptr'' else' '# परिभाषित करें MYNULL NULL'' endif' –

उत्तर

28

यह एक महीने पहले (जीसीसी 4.7.0 के लिए) तय किया गया था। बग रिपोर्ट एक दिलचस्प पढ़ने के लिए बनाता है: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

+0

Whow, मैंने पिछले सप्ताह अपने svn पेड़ को अपडेट किया था, लेकिन उस * कंपाइलर पर परीक्षण कोड नहीं चला था। रुको ... हाँ, तुम सही हो! पिछले सप्ताह से जीसीसी -4.7.0: बग रिपोर्ट लिंक के लिए './define-cplusplus.x 199711' – towi

+3

+1। बहुत ही रोचक। – Joe

+1

बग 10 से अधिक वर्षों के लिए खुला था ... वास्तव में दिलचस्प पढ़ना। – Richard

0

यह एक बहुत पुराना जी ++ बग है।

यही है, संकलक अनुरूप नहीं है।

स्पष्ट रूप से इसे ठीक नहीं किया जा सकता है क्योंकि इसे ठीक करना एक पागल मंच पर कुछ तोड़ देगा।

EDIT: ओह, मैं @ birryree की टिप्पणी से देखता हूं जिसे संस्करण 4.7.0 में ठीक किया गया है। तो, सभी के बाद ठीक करना असंभव नहीं था। हे।

चीयर्स & एचएचटी।

0

तो मुझे याद है सही ढंग से इस समस्या आ रही है जब __cplusplus एकदम सही ढंग से सेट किया गया है सोलारिस 8 से कोई लेना देना नहीं है। जीसीसी टीम ने इस विशेष खंड में अनुपालन करने के बजाय सोलारिस 8 प्लेटफ़ॉर्म का समर्थन करने के लिए उस समय निर्णय लिया था। लेकिन मैंने देखा है जीसीसी के नवीनतम संस्करण को समाप्त हो जाती है कि सोलारिस 8 समर्थन, और मुझे लगता है कि यह सही दिशा में एक पहला कदम है।

संबंधित मुद्दे