त्रुटि: 'गुंजाइश' इस दायरे में घोषित नहीं की गई थी


119

मुझे यह संदेश तब मिलता है जब g ++ 4.3 पर C ++ संकलित किया जाता है

error: NULL was not declared in this scope

यह प्रकट होता है और गायब हो जाता है और मुझे नहीं पता कि क्यों। क्यों?

धन्यवाद।


2
शायद आपने NULL की घोषणा नहीं की है कि संदेश कहां से आ रहा है?
पॉल टॉम्बलिन

1
आपको कम से कम कोड का पूरा टुकड़ा पोस्ट करना चाहिए जो त्रुटि दे रहा है। अन्यथा यह बताना बहुत मुश्किल होगा कि त्रुटि स्ट्रिंग को देखकर क्या हो रहा है।
नवीन

जवाबों:


178

NULLकोई कीवर्ड नहीं है। यह कुछ मानक हेडर में परिभाषित एक पहचानकर्ता है। आप शामिल कर सकते हैं

#include <cstddef>

कुछ अन्य मूल बातों, जैसे सहित, इसे दायरे में लाने के लिए std::size_t


भगवान, मैं जावा (एक कीवर्ड होने के कारण अशक्त) के साथ इतना खराब हो गया हूं कि मैंने कभी नहीं सोचा था कि NULL c ++ में एक कीवर्ड नहीं होगा। धन्यवाद :)
स्टीफन हेंड्रिक्स

14
वास्तव में यह जावा में कीवर्ड नहीं है।
मैन ऑफ वन वे

4
@ManofOneWay नहीं, यह जावा में मौजूद है, यह सिर्फ राजधानियों के बजाय सभी लोअरकेस के साथ वर्तनी है।
अतरैक्सिया

8
@ZettaSuro मैंने नहीं कहा कि यह मौजूद नहीं है। मैंने कहा कि यह एक खोजशब्द नहीं है।
मैन ऑफ वन वे

8
अब जब C ++ 11 को आम तौर पर कंपाइलरों द्वारा समर्थित किया जाता है, तो यह nullptrकीवर्ड को ध्यान देने योग्य हो सकता है , जो कि एक वास्तविक कीवर्ड है और इसके लिए किसी भी #includes की आवश्यकता नहीं है । यह भी अधिक से अधिक प्रकार है NULL
templatetypedef

38

GCC C ++ 11 की ओर कदम उठा रहा है, यही कारण है कि अब आपको NULL निरंतर उपयोग करने के लिए cstddef को शामिल करने की आवश्यकता है । C ++ 11 में पसंदीदा तरीका नए nullptr कीवर्ड का उपयोग करना है , जो कि संस्करण 4.6 के बाद से GCC में लागू है। nullptr अभिन्न प्रकार के लिए अभिसारी रूप से परिवर्तनीय नहीं है, इसलिए इसका उपयोग किसी फ़ंक्शन को कॉल करने के लिए किया जा सकता है जो पॉइंटर और अभिन्न प्रकार दोनों के लिए अधिभारित किया गया है:

void f(int x);
void f(void * ptr);

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.

1
लेकिन फिर भी यह एक अजीब व्यवहार है! यहां तक ​​कि मेरे कोड को -std = c ++ 98 GCC स्टिल के साथ NULL मैक्रो को पहचानना नहीं है, और यह केवल-++ 11 या gnu ++ 11 के साथ nullptr को -std के तर्क के रूप में पहचानता है।
फिरौन

2
1998 में C ++ मानक पहले ही बता चुका है कि NULL को cstddef में परिभाषित किया गया है - नए संकलक संस्करण मानक का अधिक सख्ती से पालन करते हैं क्योंकि उन्हें nullptr लागू करने की आवश्यकता होती है। आपके (दोषपूर्ण) कोड को पहले के जीसीसी संस्करणों के साथ संकलित किया गया है, लेकिन पहले के सीसीसी मानक संस्करणों के अलावा, पहले जीसीसी संस्करणों के साथ पिछड़े संगत रहना मुश्किल होगा।
सेप्पो एनरवी

NULLएक अंतर्निहित कीवर्ड कभी नहीं रहा है; यह <stddef.h>(या <cstddef>) सहित कई मानक सी हेडर में परिभाषित मैक्रो है । कैसे "सी ++ 11 की ओर कदम" को प्रभावित करता है? मुझे इस प्रश्न में कुछ भी नहीं दिखाई देता है जिसका अर्थ है कि (अनदेखी) कोड gcc / g ++ के पुराने संस्करणों के साथ या भाषा मानक के पुराने संस्करणों के साथ संकलित है।
कीथ थॉम्पसन

1
यही मैंने ऊपर कहा है: पहले से ही C ++ 98 में इसे cstddef में परिभाषित किया गया था। अभी भी gcc (और अन्य संकलक भी) ने कोड स्वीकार किया है जो पहले बिना cstddef सहित NULL का उपयोग करता था। मुझे यकीन है कि (अनदेखी) कोड पहले के संस्करणों के साथ संकलित है, भले ही यह कड़ाई से मानक अनुपालन नहीं है। अब मैं केवल अनुमान लगा रहा हूं कि आधुनिक संस्करणों का यह सख्त व्यवहार सी ++ 11 सिंटैक्स का समर्थन करने के लिए कंपाइलर के विकास के कारण है।
सिप्पो एनरवी

10

NULLएक कीवर्ड नहीं है; यह 0 के लिए एक मैक्रो प्रतिस्थापन है, और में आता है stddef.hया cstddef, मेरा मानना है। आपने #includedएक उपयुक्त शीर्ष लेख फ़ाइल नहीं बनाई है, इसलिए g ++ NULLएक नियमित चर नाम के रूप में देखता है , और आपने इसे घोषित नहीं किया है।


5

अन्य उत्तरों को पूरा करने के लिए: यदि आप C ++ 11 का उपयोग कर रहे हैं, तो उपयोग करें nullptr, जो कि एक कीवर्ड है जिसका अर्थ शून्य को इंगित करने वाला शून्य सूचक है। (इसके बजाय NULL, जो सूचक प्रकार नहीं है)


0

NULL में भी पाया जा सकता है:

#include <string.h>

String.h NULL में कहीं और से खींचेगा।


0

आप मैक्रो को पूर्ण घोषित कर सकते हैं। अपने #includes के बाद उसे जोड़ें:

#define NULL 0

या

#ifndef NULL
#define NULL 0
#endif

नहीं ";" निर्देशों के अंत में ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.