2010-08-26 7 views
22

संभव डुप्लिकेट:
Do you use NULL or 0 (zero) for pointers in C++?सी ++ में न्यूल का उपयोग करना?

यह एक अच्छा विचार सी ++ में या बस मान 0 शून्य उपयोग करने के लिए है?

क्या सी ++ से कॉलिंग कोड में न्यूल का उपयोग करके कोई विशेष परिस्थिति है? एसडीएल की तरह?

#ifndef NULL 
#ifdef __cplusplus 
#define NULL 0 
#else 
#define NULL ((void *)0) 
#endif 
#endif 

इसलिए NULL, 0 है कम से कम Windows मंच पर:

+0

ध्यान दें कि 'NULL == 0' केवल एक सम्मेलन है। नल को किसी अन्य मूल्य के साथ परिभाषित किया जा सकता है, हालांकि यह एक दुर्लभ मामला होगा। –

+0

मैं इसे दूसरी तरफ देख सकता हूं - यदि आप एक अमान्य सूचक को अर्थात् संदर्भित कर रहे हैं, तो * क्यों नहीं * आप न्यूल का उपयोग करेंगे, जो वास्तव में है? –

+2

निश्चित रूप से यह एक डुप्लिकेट प्रश्न है। –

उत्तर

25

सी ++ न्यूल में 0 या 0 एल तक फैलता है।

मैं शून्य का उपयोग करना चाहिए या 0: Stroustrup से इस टिप्पणी को देखते हैं? सी ++ में, एनयूएलएल की परिभाषा 0 है, इसलिए केवल एक सौंदर्य अंतर है। मैक्रोज़ से बचने के लिए पसंद करता हूं, इसलिए मैं 0 का उपयोग करता हूं। अन्य एनयूएलएल के साथ समस्या यह है कि लोग कभी-कभी गलती से मानते हैं कि 0 से अलग है और/या पूर्णांक नहीं है। प्री-स्टैंडर्ड कोड में, NULL को कभी-कभी कुछ अनुपयुक्त किया गया था और इसलिए से बचा जाना चाहिए था। यह दिनों में कम आम है।

यदि आपको शून्य सूचक का नाम देना है, इसे कॉल करें nullptr; यही वह है जो को C++ 0x में बुलाया जा रहा है। फिर, "nullptr" एक कीवर्ड होगा।

+1

मुझे लगता है कि मुझे आखिरी बिट पर स्ट्राउस्ट्रप से असहमत होना है। मैं उन प्रणालियों में नलप्टर के उपयोग से बचूंगा जिसमें यह पहले से ही सही कारण के लिए लागू नहीं किया गया है। नलप्टर कीवर्ड का व्यवहार एक अभिन्न परिभाषा के साथ दोहराया नहीं जा सकता है। मुझे नहीं लगता कि इसे दोहराया जा सकता है। आप परिस्थितियों में भाग सकते हैं जहां आपका कोड एक दिन एक और फिर एक कंपाइलर अपग्रेड के बाद, कुछ अलग करता है। अनिवार्य रूप से, 'nullptr' कीवर्ड का सब कुछ पता करने के लिए है। –

+1

धन्यवाद, आदमी! यह वास्तव में मदद की। #define nullptr 0 किसी भी मदद की होगी? – Jookia

+0

@ जुकीया: नहीं! अपने कोड में '#define nullptr 0' का उपयोग न करें, ऊपर नूह रॉबर्ट्स की टिप्पणी पढ़ें। यदि आप ऐसा करते हैं, तो जब आप एक C++ 0x अनुपालन कंपाइलर में अपग्रेड करते हैं तो आपका कोड संकलित नहीं हो सकता है (जो एक अच्छी बात होगी) या अजीब चीजें करें। – Praetorian

2

crtdbg.h (और कई अन्य हेडर) से। तो नहीं, मुझे नहीं पता कि मैं जानता हूं।

1

मैं कभी भी अपने सी या सी ++ कोड में न्यूल का उपयोग नहीं करता हूं। 0 ठीक काम करता है, जैसा कि if (ptrname) करता है। किसी भी सक्षम सी या सी ++ प्रोग्रामर को पता होना चाहिए कि वे क्या करते हैं।

+0

चूंकि मैं शायद ही कभी पॉइंटर्स का उपयोग करता हूं (वे सभी स्मार्ट पॉइंटर्स के अंदर हैं) इससे थोड़ा अंतर होता है। –

+0

अब सी ++ 11 नवीनतम, व्यापक रूप से उपयोग किया जाने वाला मानक है, मुझे संदेह है कि आप 'nullptr' पर भी स्विच कर चुके हैं। – peterh

+0

@ पीटरर - यूप। यह मेरा वास्तव में शुरुआती (6yo) पद था। इन दिनों मैं यह भी इंगित करना चाहता हूं कि आपको पॉइंटर्स का पूरी तरह से उपयोग करने से बचने का प्रयास करना चाहिए (लोकी की टिप्पणी के समान, लेकिन "स्मार्ट" की भी आवश्यकता नहीं है)। नए कदम semantics यह करने के लिए इतना आसान बनाते हैं। –

10

C++ शून्य का नकारात्मक पहलू यह एक मूल्य है कि चुपचाप सूचक में बदला जा सकता है एक 0. इस के लिए परिभाषित है कि, एक bool मूल्य, एक नाव/डबल, या एक पूर्णांक।

यह बहुत ही सुरक्षित नहीं है और मैंने जिस एप्लिकेशन पर काम किया है उसमें वास्तविक बग का कारण बन गया है।

इस पर विचार करें:

void Foo(int i); 
void Foo(Bar* b); 
void Foo(bool b); 


main() 
{ 
    Foo(0);   
    Foo(NULL); // same as Foo(0) 
} 

सी ++ 11 एक nullptr कि अन्य scalars करने के लिए एक नल पॉइंटर के लिए परिवर्तनीय लेकिन नहीं है परिभाषित करता है। यह 2008 के अनुसार वीसी ++ समेत सभी आधुनिक सी ++ कंपाइलर्स में समर्थित है। जीसीसी के पुराने संस्करणों में एक समान सुविधा है, लेकिन फिर इसे __null कहा जाता था।

0

मान लें कि आपके पास लाइब्रेरी या सिस्टम हेडर नहीं है जो NULL को परिभाषित करता है उदाहरण के लिए (void*)0 या (char*)0 यह ठीक है। मैं हमेशा 0 का उपयोग करता हूं क्योंकि यह परिभाषा के आधार पर शून्य सूचक है। सी ++ 0x में आपके पास nullptr उपलब्ध होगा, इसलिए सवाल अब और अधिक मायने रखता नहीं है।

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