NULL अघोषित क्यों है?


87

जब मैं इस कोड को संकलित करने की कोशिश करता हूं, तो मुझे इस संरचना के अवरोधक से समस्या होती है:

typedef struct Node
{
    Node( int data ) //
    {
        this->data = data;
        previous = NULL; // Compiler indicates here
        next = NULL;
    }

    int data;
    Node* previous;
    Node* next;
} NODE;

जब मैं आता हूं तो यह त्रुटि होती है:

\linkedlist\linkedlist.h||In constructor `Node::Node(int)':|
\linkedlist\linkedlist.h|9|error: `NULL' was not declared in this scope|
    ||=== Build finished: 1 errors, 0 warnings ===|

पिछली समस्या संरचना थी, लेकिन जब यह मेरे main.cpp में था, तो यह ठीक काम कर रहा था, इस बार यह एक हेडर फ़ाइल में है और मुझे यह समस्या दे रहा है। मैं इस कोड को संकलित करने के लिए कोड :: ब्लॉक का उपयोग कर रहा हूं

जवाबों:


139

NULLC या C ++ भाषाओं में एक अंतर्निहित स्थिरांक नहीं है। वास्तव में, C ++ में यह कम या ज्यादा अप्रचलित है, बस एक सादे शाब्दिक का उपयोग करें0 इसके बजाय उपयोग करें, संकलक संदर्भ के आधार पर सही काम करेगा।

नए C ++ (C ++ 11 और उच्चतर) में, उपयोग करें nullptr(जैसा कि टिप्पणी में बताया गया है, धन्यवाद)।

अन्यथा, जोड़ें

#include <stddef.h>

NULLपरिभाषा प्राप्त करना ।


7
NULL stddef.h का हिस्सा है, stdlib.h का नहीं। तकनीकी रूप से, आपको इसे stdlib.h के भाग के रूप में प्राप्त करने की गारंटी नहीं है, हालांकि मैं मानता हूं कि यदि आप नहीं करते तो यह बहुत ही आश्चर्यजनक होगा।
सीबी बेली

8
NULL को निम्नलिखित C हेडर में परिभाषित किया गया है: stddef.h, stdlib.h, stdio.h, locale.h, string.h, और time.h (और wchar.h यदि आप C99 की गिनती करते हैं)।
माइकल बूर

8
<cstddef>क्लीनर विकल्प है।
फ्रेड फू

29
जब आप "NULL" का अर्थ "0" का उपयोग न करें! एक अंतर है : शब्दार्थ। कभी भी यह जानने के महत्व को कम मत समझो कि कुछ क्या है और सही शब्द का उपयोग कर रहा है, भले ही संकलक आपको इसके साथ दूर जाने देगा!
imallett

13
@ 6502 उस बारे में बात नहीं कर रहा है; 0 और NULL का समान मान (लगभग) हमेशा होता है, इसलिए '\ 0' या 0 का उपयोग करना आकस्मिक रूप से काम करेगा। समस्या शब्दार्थ है। NULL का उपयोग अधिक अभिव्यंजक है, क्योंकि यह कहता है कि मान प्रश्न है एक सूचक है, न कि केवल एक पूर्णांक।
imallett

34

NULL का उपयोग करें। यह वैसे भी 0 के रूप में # परिभाषित है और यह पूर्णांक से इसे अलग करने के लिए बहुत उपयोगी है।

0 (और इसलिए NULL) का उपयोग करने में समस्याएं हैं। उदाहरण के लिए:

void f(int);
void f(void*);

f(0); // Ambiguous. Calls f(int).

C ++ (C ++ 0x) के अगले संस्करण में nullptrइसे ठीक करना शामिल है।

f(nullptr); // Calls f(void*).

5
यह ((void *)0)सबसे सी मानक पुस्तकालय कार्यान्वयन के रूप में परिभाषित किया गया है।
Triang3l

1
यह सबसे अच्छा संक्षिप्त उत्तर है (और तकनीकी रूप से सटीक) मैंने कभी इस विषय के बारे में पढ़ा है: NULL बनाम 0 बनाम nullptr। धन्यवाद!
jose.angel.jimenez

2
@SiPlus ((void *)0)C ++ में गलत है, क्योंकि void*अन्य पॉइंटर प्रकारों के साथ ज़बरदस्ती नहीं की जाती है जिस तरह से यह C. glibc में होता है, उदाहरण के लिए, #define NULL 0जब __cplusplusपरिभाषित किया जाता है।
rpjohnst

16

NULLकोर C ++ भाषा का मूल भाग नहीं है, लेकिन यह मानक पुस्तकालय का हिस्सा है। आपको मानक हेडर फ़ाइलों में से एक को शामिल करने की आवश्यकता है जिसमें इसकी परिभाषा शामिल है। #include <cstddef>या#include <stddef.h> पर्याप्त होना चाहिए।

NULLयदि आप शामिल हैं cstddefया उपलब्ध हैं, तो इसकी परिभाषा उपलब्ध होने की गारंटी है stddef.h। इसकी गारंटी नहीं है, लेकिन यदि आप इसके बजाय अन्य मानक हेडर शामिल करते हैं, तो आपको इसकी परिभाषा शामिल करने की बहुत संभावना है।


12

क्या आप इस फाइल में "stdlib.h" या "cstdlib" शामिल हैं? NULL को stdlib.h / cstdlib में परिभाषित किया गया है

#include <stdlib.h>

या

#include <cstdlib>  // This is preferrable for c++

2
NULL stddef.h का हिस्सा है, stdlib.h का नहीं
awiebe

@awiebe वह था जो मैंने पांच मिनट पहले तक सोचा था - C99 के अनुसार कुछ अलग हेडर फ़ाइलों को इसे परिभाषित करना है। धारा 7.17 के लिए stddef.h की आवश्यकता होती है, 7.20 को stdlib.h में इसकी आवश्यकता होती है, और संभवत: कुछ अच्छे लोग हैं।
एजेएम-रिंस्टेट-मोनिका

4

उपयोग न करें NULL, C ++ आपको 0इसके बजाय अनएडॉर्न का उपयोग करने की अनुमति देता है :

previous = 0;
next = 0;

और, C ++ 11 में, आप आमतौर पर NULL या तो उपयोग नहीं करना चाहिए या0 क्योंकि यह आपको nullptrप्रकार प्रदान करता है std::nullptr_t, जो कार्य के लिए बेहतर है।


33
मुझे लगता है कि NULL एक उपयोगी दस्तावेज है जिसे आप एक पूर्णांक स्थिरांक के बजाय एक अशक्त सूचक का उपयोग करने का इरादा कर रहे हैं, हालांकि मुझे 0. का उपयोग करने में कोई आपत्ति नहीं है। मैं मानता हूँ कि आप इस समय कोई व्यावहारिक लाभ प्राप्त नहीं करते हैं। , लेकिन यदि आप अगले C ++ संस्करण को अपनाते हैं, तो यह नए नल्टप्रेटर स्थिरांक का उपयोग करने के लिए स्थानों को बदलने के लिए एक अच्छी शुरुआत देता है।
सीबी बेली

1
मैं आप दोनों से सहमत हूँ, बिल्कुल। संयोग से, यह दोनों अच्छा है कि एक दस्तावेज़ एक पॉइंटर का उपयोग करता है, लेकिन एक अच्छा दस्तावेज़ भी है जो वास्तव में पूर्णांक को आगे रखता है। प्रिंटफ पर विचार करें ("% p \ n", NULL); // ओह, यूबी। या यदि आपके पास दो अधिभार हैं, तो शून्य च (इंट); void f (शून्य *); आप सोच सकते हैं कि f (NULL); कॉल पर एक त्वरित नज़र रखने पर शून्य * संस्करण को कॉल करता है। च (0); इस तथ्य को प्रलेखित करेगा कि यह वास्तव में इंट संस्करण को कॉल करेगा, लेकिन इस तथ्य का दस्तावेजीकरण नहीं करेगा कि आप जो इरादा करते हैं, वह एक पॉइंटर पास करता है :( अच्छा है कि nullptr इसे ठीक करता है :)
जोहान्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.