2009-01-20 13 views
101

में घोषित नहीं किया गया था जब C++ संकलन जीसीसी 4,3त्रुटि: 'शून्य' इस दायरे

error: ‘NULL’ was not declared in this scope 

ऐसा प्रतीत होता है और गायब हो जाता है पर मैं इस संदेश को मिलता है और मैं पता नहीं क्यों। क्यूं कर?

धन्यवाद।

+2

शायद आपने संदेश कहां से आ रहा है, इस दायरे में न्यूल घोषित नहीं किया है? –

+1

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

उत्तर

160

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

#include <cstddef> 

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

+0

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

+13

दरअसल यह जावा में कोई कीवर्ड नहीं है। –

+4

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

10

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

32

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

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

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

लेकिन फिर भी यह एक अजीब व्यवहार है! यहां तक ​​कि मेरे कोड को संकलित करने के साथ -std = C++ 98 जीसीसी अभी भी पूर्ण मैक्रो को नहीं पहचानता है, और यह केवल C++ 11 या gnu ++ 11 के साथ nstptr को -std के लिए तर्क के रूप में पहचानता है। – pharaoh

+2

सी ++ मानक ने पहले से ही 1 99 8 में कहा है कि एनएलएलएल को सीएसडीडीडीएफ में परिभाषित किया गया है - नए कंपाइलर संस्करण मानक को अधिक सख्ती से पालन करते हैं क्योंकि उन्हें नलप्टर को लागू करने की आवश्यकता होती है।आपका (दोषपूर्ण) कोड पहले जीसीसी संस्करणों के साथ संकलित है, लेकिन पहले सी ++ मानक संस्करणों के अलावा, पिछले जीसीसी संस्करणों के साथ पिछड़े संगत रहना मुश्किल होगा। –

+0

'NULL' कभी भी अंतर्निहित कीवर्ड नहीं रहा है; यह कई मानक सी शीर्षकों में परिभाषित एक मैक्रो है, जिसमें '' (या '') शामिल है। जीसीसी "सी ++ 11 की ओर कदम उठाने" को कैसे प्रभावित करता है? मुझे इस प्रश्न में कुछ भी नहीं दिखता है जिसका अर्थ है कि (अदृश्य) कोड जीसीसी/जी ++ के पहले संस्करणों या भाषा मानक के पुराने संस्करणों के साथ संकलित है। –

4

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

0

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

#define NULL 0 

या

#ifndef NULL 
#define NULL 0 
#endif 

नहीं "," अधिसूचनाओं के दौरान।

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