2012-08-19 10 views
30

C++ primer के अनुसार, <cstdlib> शीर्षलेख NULL परिभाषित करता है। cpluspplus का कहना है कि इसे <cstddef> में परिभाषित किया गया है।क्या हेडर सी ++ में न्यूल को परिभाषित करता है?

आखिरकार, यदि दायां हेडर शामिल नहीं है, तो मैंने सोचा कि NULL संदर्भित नहीं किया जा सकता है।

मैं क्या देख सकते हैं से, लेकिन यह संदर्भित किया जा सकता है और कार्यक्रमों का उत्पादन और उस संकलन और चेतावनियों या त्रुटियों के बिना चलने केवल <iostream>

सहित कृपया मेरी मदद इस बात को समझ के बाद,।

+6

Btw, , और इसके बजाय nullptr का उपयोग किया जाना चाहिए। – wjl

+2

यह ठीक है, लेकिन यह –

+2

@wjl प्रश्न का उत्तर नहीं देता है: यहां तक ​​कि सी ++ 03 में, मैं 'NULL' के बजाय' 0' का उपयोग करने की सलाह दूंगा। –

उत्तर

19

सी ++ 03 खंड 18.1.2 में लगातार कहना है कि शून्य cstddef में परिभाषित किया गया है है।

कुछ कार्यान्वयन पर, iostream में cstddef शामिल हो सकता है, इसलिए iostream सहित आपको NULL भी शामिल होगा।

3

यह <cstddef>

में सी ++ 11 मानक खंड 18.2 परिभाषित किया गया है, टेबल 30 बताते हैं क्या <cstddef> में यह कहते हैं:

तालिका 30 - हैडर <cstddef> सार

मैक्रो : NULL [...]

[...] मैक्रो न्यूल एक कार्यान्वयन-de फाई नेड सी ++ नल पॉइंटर इस अंतर्राष्ट्रीय मानक

+0

प्रश्न का उत्तर नहीं देता है। यह मूल्य कार्यान्वयन परिभाषित है, इसकी उपस्थिति नहीं। –

+0

ठीक है, यह तब क्यों काम करता है जब उपर्युक्त में से कोई भी शामिल नहीं है? –

+0

@ जेम्स लियोनार्ड: अन्य शीर्षलेख (और शायद ऐसा करते हैं) में '' शामिल हो सकते हैं। – Cornstalks

29

सी मानक की आवश्यकता है कि शून्य में locale.h, stddef.h, stdio.h, stdlib.h, string.h, time.h, और wchar.h में परिभाषित किया जा।

सी ++ मानक के लिए आवश्यक है कि प्रत्येक को c* शीर्षलेख में एनयूएलएल परिभाषित किया जाए।

सी मानक मानक नाम परिभाषित करने वाले नामों के बारे में बहुत सख्त है - प्रत्येक मानक शीर्षलेख को सटीक नामों को परिभाषित करना होगा मानक को उस हेडर को परिभाषित करने की आवश्यकता होती है। इसे परिभाषित करने वाले एकमात्र अन्य नाम वे हैं जो कार्यान्वयन के लिए आरक्षित हैं, जैसे कि अंडरस्कोर से शुरू होने वाले अन्य अंडरस्कोर या पूंजी पत्र के बाद।

सी ++ मानक इस संबंध में अधिक अनुमोदित है - जिसमें किसी एक मानक शीर्षलेख का प्रभाव किसी भी या सभी अन्य मानक शीर्षकों सहित हो सकता है।

एक व्यावहारिक दृष्टिकोण से, सी ++ कार्यान्वयन इस अनुमति के काफी लाभ लेने के लिए प्रयुक्त होता है - यानी, एक मानक शीर्षलेख सहित कई अन्य मानक शीर्षकों से नामों को अक्सर परिभाषित किया जाता है। अधिक हालिया कार्यान्वयन सी मानक की आवश्यकता के रूप में अधिक काम करते हैं, प्रत्येक शीर्षलेख के करीब रहना केवल उस शीर्षलेख द्वारा परिभाषित किए जाने वाले नामों को परिभाषित करता है। वे अभी भी इसके बारे में सख्त नहीं हैं क्योंकि सी मानक की आवश्यकता है, लेकिन वे (नियम के रूप में) होने के करीब थे।

3

सी ++ 11 मानक कहता है NULL एकाधिक फ़ाइलों में परिभाषित किया जाना चाहिए।वे हैं:

<clocale> 
<cstddef> 
<cstdlib> 
<cstring> 
<ctime> 
<cwchar> 

इस धारा C.3 सी मानक पुस्तकालय/3 मानक के टेबल 149 में बताया गया है।

यहां तालिका और कुछ आसपास के पाठ की एक छवि है।

enter image description here

-3

MinGW के नवीनतम संस्करण में (MinGW 5.3.0) शून्य के रूप में wchar.h हेडर में निर्धारित किया गया था: में सी ++ 11, शून्य पूरी तरह से हटा दिया गया है

#define NULL 0 
+0

यह प्रश्न किसी विशेष कंपाइलर के बारे में नहीं है। आर साहू का जवाब देखें –

+0

यह मौजूदा उत्तरों के लिए कुछ भी नहीं है जो पहले से पहले _four साल पहले_ है, जो पहले से ही हमें बताता है कि 'wchar.h' - या, बल्कि,' cwchar' - इस परिभाषा को धारण करता है। –

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