2009-12-22 14 views
8
#ifndef NULL 
#define NULL NULL 
#endif 

यह कोड जीसीसी में कोई चेतावनी/त्रुटियों के साथ संकलित नहीं है। क्या कोई समझा सकता है कि प्रीप्रोसेसर क्या कर रहा है?# परिभाषित न्यूल नल

+1

शून्य मतलब यह नहीं है सी में अपरिभाषित/C++ ... – Artelius

+3

यह शायद #define धड़कता SIXTY_NINE 69 http://bugpwr.blogspot.com/2007/07/magic-numbers-in-code.html –

+0

कोशिश करने के लिए: #ifndef NULL # परिभाषित करें 0 #endif – TripleS

उत्तर

19

कहीं भी संकलक पाठ "शून्य" यह पाठ "शून्य" से प्रतिस्थापित कर देगा देखता है। यह "न्यूल" के लिए आपके कोड में एक खोज-और-प्रतिस्थापन करने जैसा है और "न्यूल" के साथ बदल रहा है। अवैध नहीं, बस अजीब :)

+6

मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि यह निश्चित रूप से ऐसा नहीं कर रहा है जब तक कि न्यूल अनिर्धारित न हो। न्यूल आमतौर पर परिभाषित किया जाता है, इसलिए यह ब्लॉक शायद कुछ भी नहीं करता है। – Adam

5

देना सामान्य बात है:

#ifndef JON_SKEET 
#define JON_SKEET JON_SKEET 
#endif 

यह भी संकलित करता है। ऐसा इसलिए है क्योंकि प्रीप्रोसेसर बस दिमागी प्रतिस्थापन करता है। यह क्या बदलता है और इसके साथ क्या बदलता है उसे मान्य पहचानकर्ता होने की आवश्यकता नहीं है।

इस तरह से सोचें: अपने संपादक की खोज को खोलें & विंडो को बदलें और Replace और Replace with फ़ील्ड दोनों में "NULL" टाइप करें। यह कोई त्रुटि या चेतावनी नहीं देगा और यह "काम" करेगा, भले ही यह वास्तव में कुछ भी नहीं करता है। प्रीप्रोसेसर वही काम करता है।

जाहिर है आप इसका इस्तेमाल करने का प्रयास करते:

 
'JON_SKEET' undeclared (first use in this function) 
(Each undeclared identifier is reported only once 
for each function it appears in.) 
+0

हां, लेकिन इस तरह के ब्लॉक आम तौर पर इंगित करते हैं कि * तथ्य यह है कि प्रतीक परिभाषित किया गया है * क्या मायने रखता है। नल के लिए ऐसा करने के लिए बहुत अजीब बात है। – Aaronaught

+0

वास्तव में नहीं, यह एक आवश्यकता नहीं है। –

0

क्या यह केवल चरित्र अनुक्रम "न्यूल" के रूप में न्यूल को परिभाषित नहीं करता है?

+1

नहीं। यह '# परिभाषित न्यूल "होगा" शून्य "' –

+2

जब आप चरित्र अनुक्रम कहते हैं और उद्धरण का उपयोग करते हैं तो सावधान रहें, क्योंकि ऐसा लगता है कि आप एक सी-स्ट्रिंग वर्ण सरणी' 'न्यूल' 'का जिक्र कर रहे हैं। – catchmeifyoutry

+0

वह था, क्योंकि सवाल था ... – dicroce

2

स्पष्ट रूप से यह मैक्रो के रूप में उपयोग नहीं किया जा रहा है, इसका उपयोग संकलन ध्वज के रूप में किया जा रहा है। क्या कोड के अन्य क्षेत्र हैं जहां आप #ifdef NULL या #ifndef NULL देखते हैं?

यह, "शून्य" का उपयोग करने के लिए विशेष रूप से इस तरह के एक ध्वज के रूप में, बहुत ही अजीब है, लेकिन मैं अजनबी (#define TRUE FALSE) देखा है ...

14

ऐसा करने के लिए केवल संभावित कारण यह क्या करना होगा पहले हेडर फाइल जो खुद की तरह

#ifndef NULL 
#define NULL (void *)0 
#endif 

यह कुछ करना तो उस तरह परिभाषित किया जा रहा से शून्य बंद कर देंगे भी शामिल है।

वहाँ जब तक कोड है कि शून्य undefs पूर्ववर्ती, यह पूरी तरह से #define NULL NULL लंघन है:

+8

महोदय, मैं आपके अवतार को स्वीकार करता हूं। मैंने लंबे समय से लेमिंग्स के बारे में सोचा नहीं है। –

+0

क्या यह सिर्फ इतना रहस्यमय सवाल नहीं उठाता है कि आप किसी अन्य शीर्षलेख में परिभाषित होने से NULL को क्यों रोकना चाहते हैं? – Aaronaught

+0

ठीक है, मुझे धड़कता है :) – Artelius

1
क्या पूर्वप्रक्रमक कर रहा है के सवाल के जवाब में

। नल लगभग निश्चित रूप से पहले ही परिभाषित किया गया है। सी ++ में, सी ++ की कड़े प्रकार की जांच के कारण 0 का उपयोग पसंद किया जाता है। यदि आपको NULL का उपयोग करना होगा, तो const int NULL = 0; घोषित करना सबसे अच्छा है (Stroustrup की धारा 5.1.1 देखें)।

3

मैंने ऐसे मामलों को देखा है जहां इस तरह का कोड कंप्रेसर नेमस्पेस (सामान्य रूप से नामस्थान ", सी ++ namespace) से प्रीप्रोसेसर नेमस्पेस, उदा।:

// In the compiler namespace, not in the preprocessor namespace 
static int const FOO = 1234; 

// Bring the constant into the preprocessor namespace as well 
#ifndef FOO  // <---- FOO really is undefined here. 
#define FOO FOO 
#endif 

वास्तव में बदसूरत सामान।

व्यक्तिगत रूप से मुझे इस तरह की चीज़ के लिए उपयोग नहीं मिला है, लेकिन फिर भी मौजूद है।


संपादित: मैं इस देखा है, वहीं मैं नहीं जानता कि क्यों यह उपयोगी है, अन्य की जांच की तुलना में अगर "FOO" एक पूर्वप्रक्रमक प्रतीक कहीं और कोड में के रूप में परिभाषित हो सकता है; शायद कुछ विरासत कोड से निपटने में। किसी को?

+0

हम्म, मैंने सोचा कि मेरे पास इसका उपयोग था एक पल, लेकिन फिर मुझे एहसास हुआ कि यह गलत था। यदि खाद्य पहले से ही परिभाषित किया गया है, तो इसे 'स्थिर int const FOO = 1234' पंक्ति में बदल दिया जाएगा। मुझे नहीं पता कि आप उन शर्तों के तहत आगे बढ़ने के लिए तैयार क्यों होंगे। '# खाद्य परिभाषित करें' संभावित रूप से समझ में आता है, जैसा कि आप कहते हैं, यदि आप एक मैक्रो को निरंतर के साथ बदल रहे हैं लेकिन कुछ पुराने कोड को बदलना नहीं चाहते हैं जो इसे परिभाषित करने के लिए जांचता है। लेकिन जब आप निरंतर भोजन को परिभाषित कर रहे हैं तो फू को किसी और चीज को परिभाषित करने दें। –

+0

@ स्टेव: सहमत। इस तरह का कोड निश्चित रूप से अजीब है। – Void

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