मैं सर्वोच्च हेडर फाइल में मैक्रो नीचे देखा है:
आपको लगता है कि देखा है नहीं करना चाहिए, मानक पुस्तकालय <cstddef>
(और <stddef.h>
) में यह परिभाषित करता है। और, आईआईआरसी, मानकों के मुताबिक मानक हेडर फाइलों द्वारा परिभाषित नामों को फिर से परिभाषित करने के परिणामस्वरूप अपरिभाषित व्यवहार होता है। तो पूरी तरह से मानक दृष्टिकोण से, आपको ऐसा नहीं करना चाहिए।
मैंने देखा है लोगों को निम्नलिखित, जो भी कारण के लिए कर के उनके टूटे मन सोचा:
struct X{
virtual void f() = NULL;
}
(में [गलत तरीके से] के रूप में: "NULL
करने के लिए आभासी तालिका सूचक सेट")
यह तभी मान्य NULL
, क्योंकि = 0
शुद्ध आभासी कार्य (§9.2 [class.mem]
) के लिए मान्य टोकन है 0
के रूप में परिभाषित किया जाता है।
जिसके अनुसार, अगर NULL
था सही ढंग से एक अशक्त सूचक निरंतर रूप में इस्तेमाल किया है, तो कुछ भी नहीं तोड़ना चाहिए।
हालांकि, कि सावधान रहना, मालूम होता है सही ढंग से इस्तेमाल भले ही, इस बदल जाएगा:
void f(int){}
void f(char*){}
f(0); // calls f(int)
f(nullptr); // calls f(char*)
हालांकि, अगर है कि कभी मामला था, यह लगभग निश्चित रूप से वैसे भी टूट गया था।
'आपको वह नहीं देखा जाना चाहिए था'। तुम ऐसा क्यों महसूस करते हो? मैंने डब्लूसीडीएमए एल 1 के लिए डीएसपी के उत्पादन कोड में '# डिफिन न्यूल (शून्य *) (0)' जैसे अजीब मैक्रो को भी देखा है। – iammilind
'वर्चुअल शून्य एफ() = 0 एल;' कानूनी है? क्योंकि '# डिफिन न्यूल 0 एल' निश्चित रूप से एक अनुरूप कार्यान्वयन है। –
@iammilind: आपको नहीं करना चाहिए, क्योंकि 'NULL' पहले ही मानक द्वारा परिभाषित किया गया है। – Xeo