2010-03-10 17 views
46

मैंने देखा कि nullptr विजुअल स्टूडियो 2010 में लागू किया गया था। मुझे अवधारणा पसंद है और जितनी जल्दी हो सके इसे शुरू करना चाहते हैं; हालांकि जीसीसी अभी तक इसका समर्थन नहीं करता है। मेरे कोड को दोनों पर चलाने की जरूरत है (लेकिन अन्य कंपाइलरों के साथ संकलन करने की आवश्यकता नहीं है)।क्या जीसीसी में नकली हो सकती है?

क्या इसका अनुकरण करने का कोई तरीका है? कुछ की तरह:

#define nullptr NULL 

(यही कारण है कि स्पष्ट रूप से सब पर अच्छी तरह से काम नहीं होता, यह सिर्फ दिखाने के लिए मैं क्या मतलब है।)

उत्तर

60

The Official proposal एक समाधान है -

const      // this is a const object... 
class { 
public: 
    template<class T>   // convertible to any type 
    operator T*() const  // of null non-member 
    { return 0; }   // pointer... 
    template<class C, class T> // or any type of null 
    operator T C::*() const // member pointer... 
    { return 0; } 
private: 
    void operator&() const; // whose address can't be taken 
} nullptr = {};    // and whose name is nullptr 
+3

धन्यवाद। क्या आपको यह भी पता है कि क्या 'nullptr' लागू किया गया है, यह पता लगाने का कोई तरीका है कि __cplusplus के संस्करण पर निर्भर किए बिना (क्योंकि तकनीकी रूप से मैं C++ 0x का उपयोग कर रहा हूं, और nullptr वहां नहीं है) – nuzz

+10

@nuzz: फिर आप नहीं हैं सी ++ 0x का उपयोग नहीं कर रहा हूँ। :) – Bill

+3

ठीक है, मैं सी ++ 0x का एक हिस्सा उपयोग कर रहा हूं;) – nuzz

8

यह जीसीसी की तरह दिखता है 4.6 के रूप में nullptr का समर्थन करता है।

6

इसके अलावा, जीसीसी (वास्तव में जी ++) में वर्षों के लिए __null एक्सटेंशन है। जब नलप्टर प्रस्ताव निकला तो इसे उद्योग कार्यान्वयन अनुभव के रूप में गिना गया था।

__null एक्सटेंशन विशेष मामलों का पता लगा सकता है और उनके बारे में चेतावनी दे सकता है जैसे गलती से एक बूल पैरामीटर को नल से गुजरना, जब यह एक सूचक पैरामीटर (एक फ़ंक्शन में किए गए परिवर्तन, कॉल पक्ष को अनुकूलित करने के लिए भूल गया) ।

बेशक यह पोर्टेबल नहीं है। उपरोक्त टेम्पलेट समाधान पोर्टेबल है।

+0

__null सिर्फ एनसीसी को जीसीसी के लिए परिभाषित किया गया है, जो यह चेतावनियां जारी करने के लिए उपयोग करता है। यह न्यूल का उपयोग करने से अलग नहीं है, और इसमें समान अर्थशास्त्र नहीं है जो नलप्टर के रूप में है। – rdb

4

यह जीसीसी 4.6.1 (उबंटू 11.11 वनरिक) द्वारा दिखता है, नलप्टर जोड़ा गया है।

एक त्वरित, पुनरावर्ती एसईडी मेरी HPP/सीपीपी फाइलों पर ढूंढें और की जगह ठीक मेरे लिए काम किया:

find . -name "*.[hc]pp" | xargs sed -i 's/NULL/nullptr/g' 
2

यह सबसे अधिक संभावना है आप -std = भूल C++ 0x। जीसीसी का मेरा मिंगव संस्करण 4.6.1/4.7.1 है, दोनों समर्थन nullptr अच्छी तरह से।

"सी ++ मानक पुस्तकालय, एक ट्यूटोरियल और संदर्भ, 2" में वर्णन के अनुसार, नलप्टर एक कीवर्ड है, स्वचालित रूप से प्रत्येक सूचक प्रकार में परिवर्तित हो सकता है लेकिन पूर्णांक प्रकार नहीं, यह न्यूल की कमी को दूर करता है, जो संदिग्ध है निम्नलिखित अधिभार समारोह: शून्य एफ (int); शून्य एफ (शून्य *);

एफ (एनयूएलएल); // अस्पष्ट एफ (नलप्टर); // ठीक

टेस्ट VC2010 में इस सुविधा से पता चलता वास्तविक संकलक के साथ MSDN दस्तावेज़ संघर्ष, दस्तावेज़ कहा कि:

nullptr कीवर्ड एक प्रकार नहीं है और साथ प्रयोग के लिए समर्थित नहीं है:

sizeof

typeid

फेंक nullptr

VC2010 में वास्तव में

, ऊपर ऑपरेटर/एक्सप्रेस के सभी आयन कानूनी है। sizeof (nullptr) परिणाम 4. typeid.name() परिणाम std :: nullptr_t, और फेंक नलप्टर को "कॉन्स्ट शून्य *" और "शून्य *" (और अन्य सूचक प्रकार) द्वारा पकड़ा जा सकता है।

जीसीसी (4.7.1) nullptr के बारे में और अधिक कठोर लग रहा है, वहीं फेंक nullptr "शून्य *" द्वारा पकड़ा नहीं किया जा सकता, द्वारा 'पकड़ा जा सकता है ...'

+3

नहीं, यह संभवतः प्रश्न 2 साल पुराना है, एक समय से जहां जीसीसी ने 'नप्पटर' का समर्थन नहीं किया था। लेकिन जवाब यह कहते हैं कि 4.6 इसका समर्थन करता है वास्तव में 1.5 साल पुराना है, पहले से ही। तो मुझे लगता है कि आपका "उत्तर" पूरी तरह से अप्रचलित है। –

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