#ifndef NULL
#define NULL NULL
#endif
यह कोड जीसीसी में कोई चेतावनी/त्रुटियों के साथ संकलित नहीं है। क्या कोई समझा सकता है कि प्रीप्रोसेसर क्या कर रहा है?# परिभाषित न्यूल नल
#ifndef NULL
#define NULL NULL
#endif
यह कोड जीसीसी में कोई चेतावनी/त्रुटियों के साथ संकलित नहीं है। क्या कोई समझा सकता है कि प्रीप्रोसेसर क्या कर रहा है?# परिभाषित न्यूल नल
कहीं भी संकलक पाठ "शून्य" यह पाठ "शून्य" से प्रतिस्थापित कर देगा देखता है। यह "न्यूल" के लिए आपके कोड में एक खोज-और-प्रतिस्थापन करने जैसा है और "न्यूल" के साथ बदल रहा है। अवैध नहीं, बस अजीब :)
मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि यह निश्चित रूप से ऐसा नहीं कर रहा है जब तक कि न्यूल अनिर्धारित न हो। न्यूल आमतौर पर परिभाषित किया जाता है, इसलिए यह ब्लॉक शायद कुछ भी नहीं करता है। – Adam
देना सामान्य बात है:
#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.)
हां, लेकिन इस तरह के ब्लॉक आम तौर पर इंगित करते हैं कि * तथ्य यह है कि प्रतीक परिभाषित किया गया है * क्या मायने रखता है। नल के लिए ऐसा करने के लिए बहुत अजीब बात है। – Aaronaught
वास्तव में नहीं, यह एक आवश्यकता नहीं है। –
क्या यह केवल चरित्र अनुक्रम "न्यूल" के रूप में न्यूल को परिभाषित नहीं करता है?
नहीं। यह '# परिभाषित न्यूल "होगा" शून्य "' –
जब आप चरित्र अनुक्रम कहते हैं और उद्धरण का उपयोग करते हैं तो सावधान रहें, क्योंकि ऐसा लगता है कि आप एक सी-स्ट्रिंग वर्ण सरणी' 'न्यूल' 'का जिक्र कर रहे हैं। – catchmeifyoutry
वह था, क्योंकि सवाल था ... – dicroce
स्पष्ट रूप से यह मैक्रो के रूप में उपयोग नहीं किया जा रहा है, इसका उपयोग संकलन ध्वज के रूप में किया जा रहा है। क्या कोड के अन्य क्षेत्र हैं जहां आप #ifdef NULL
या #ifndef NULL
देखते हैं?
यह, "शून्य" का उपयोग करने के लिए विशेष रूप से इस तरह के एक ध्वज के रूप में, बहुत ही अजीब है, लेकिन मैं अजनबी (#define TRUE FALSE
) देखा है ...
ऐसा करने के लिए केवल संभावित कारण यह क्या करना होगा पहले हेडर फाइल जो खुद की तरह
#ifndef NULL
#define NULL (void *)0
#endif
यह कुछ करना तो उस तरह परिभाषित किया जा रहा से शून्य बंद कर देंगे भी शामिल है।
वहाँ जब तक कोड है कि शून्य undefs पूर्ववर्ती, यह पूरी तरह से #define NULL NULL
लंघन है:
महोदय, मैं आपके अवतार को स्वीकार करता हूं। मैंने लंबे समय से लेमिंग्स के बारे में सोचा नहीं है। –
क्या यह सिर्फ इतना रहस्यमय सवाल नहीं उठाता है कि आप किसी अन्य शीर्षलेख में परिभाषित होने से NULL को क्यों रोकना चाहते हैं? – Aaronaught
ठीक है, मुझे धड़कता है :) – Artelius
। नल लगभग निश्चित रूप से पहले ही परिभाषित किया गया है। सी ++ में, सी ++ की कड़े प्रकार की जांच के कारण 0 का उपयोग पसंद किया जाता है। यदि आपको NULL का उपयोग करना होगा, तो const int NULL = 0;
घोषित करना सबसे अच्छा है (Stroustrup की धारा 5.1.1 देखें)।
मैंने ऐसे मामलों को देखा है जहां इस तरह का कोड कंप्रेसर नेमस्पेस (सामान्य रूप से नामस्थान ", सी ++ 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
" एक पूर्वप्रक्रमक प्रतीक कहीं और कोड में के रूप में परिभाषित हो सकता है; शायद कुछ विरासत कोड से निपटने में। किसी को?
हम्म, मैंने सोचा कि मेरे पास इसका उपयोग था एक पल, लेकिन फिर मुझे एहसास हुआ कि यह गलत था। यदि खाद्य पहले से ही परिभाषित किया गया है, तो इसे 'स्थिर int const FOO = 1234' पंक्ति में बदल दिया जाएगा। मुझे नहीं पता कि आप उन शर्तों के तहत आगे बढ़ने के लिए तैयार क्यों होंगे। '# खाद्य परिभाषित करें' संभावित रूप से समझ में आता है, जैसा कि आप कहते हैं, यदि आप एक मैक्रो को निरंतर के साथ बदल रहे हैं लेकिन कुछ पुराने कोड को बदलना नहीं चाहते हैं जो इसे परिभाषित करने के लिए जांचता है। लेकिन जब आप निरंतर भोजन को परिभाषित कर रहे हैं तो फू को किसी और चीज को परिभाषित करने दें। –
@ स्टेव: सहमत। इस तरह का कोड निश्चित रूप से अजीब है। – Void
शून्य मतलब यह नहीं है सी में अपरिभाषित/C++ ... – Artelius
यह शायद #define धड़कता SIXTY_NINE 69 http://bugpwr.blogspot.com/2007/07/magic-numbers-in-code.html –
कोशिश करने के लिए: #ifndef NULL # परिभाषित करें 0 #endif – TripleS