2012-05-16 17 views
38

हमें किस मामले में कैसर्ट शामिल करना चाहिए?किस मामले में हमें <cassert> शामिल करना होगा?

+13

+1 अनदेखा डाउनवॉट्स का मुकाबला करने के लिए। –

+5

@ करीबी मतदाता: कृपया केवल उन प्रश्नों पर वोट दें जिन्हें आप समझते हैं। आपकी समझ की कमी अर्थ की कमी का संकेत नहीं देती है, या किसी प्रश्न का उत्तर देना असंभव है। आपकी समझ की कमी केवल इंगित करती है कि आप समझ में नहीं आते हैं, जो इस मामले पर वोट देने के लिए सक्षम होने के विपरीत है। –

+4

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

उत्तर

7

किसी भी अन्य शीर्षलेख फ़ाइल की तरह, आप #include <cassert> जब आप उस शीर्षलेख फ़ाइल में घोषित कुछ का उपयोग करते हैं, जैसे assert()

+0

संक्षिप्त और स्पष्ट उत्तर के लिए धन्यवाद :) – Jane

0

एक आसानी से सुलभ reference

#include <iostream> 
// uncomment to disable assert() 
// #define NDEBUG 
#include <cassert> 

int main() 
{ 
    assert(2+2==4); 
    std::cout << "Execution continues past the first assert\n"; 
    assert(2+2==5); 
    std::cout << "Execution continues past the second assert\n"; 
} 
+6

* नाइटपिकिंग *: cppreference.com ** एक संदर्भ ** है, नहीं ** संदर्भ **। यदि आप ** संदर्भ ** का संदर्भ देना चाहते हैं, तो "अंतर्राष्ट्रीय मानक आईएसओ/आईईसी 14882" या उसके संस्करणों में से एक का संदर्भ लें: "14882: 1998", "14882: 2003", या "14882: 2011"। –

+0

मदद के लिए बहुत बहुत धन्यवाद! मैं इस तरह के बेवकूफ सवाल के लिए ssory हूँ। मैं अभी करता हूँ। – Jane

+1

@ जेन आपका स्वागत है। कृपया एफएक्यू पर एक नज़र डालें: http: // stackoverflow।com/faq – TemplateRex

40

संक्षेप में, उसका उपयोग नहीं करते देखें; <assert.h> का उपयोग करें।

सी ++ 11 ने "सी ...." हेडर की औपचारिक गारंटी को वैश्विक नामस्थान प्रदूषित नहीं किया है।

यह कभी भी अभ्यास की गारंटी नहीं थी, और अब यह औपचारिक गारंटी भी नहीं है।

इसलिए, सी ++ 11 के साथ "सी ...." हेडर वेरिएंट का उपयोग करने में अब कोई कल्पनीय लाभ नहीं है, जबकि एक संकलक और संस्करण के साथ अच्छी तरह से काम करने वाला कोड स्पष्ट और स्पष्ट नुकसान है वह कंपाइलर, उदाहरण के कारण, किसी अन्य कंपाइलर या संस्करण के साथ संकलित करने में विफल हो सकता है ग्लोबल नेमस्पेस में नाम टकराव या अलग अधिभार चयन।

SO, जबकि cassert सी ++ 03 में बहुत अर्थहीन था (आप नामस्थान में मैक्रो नहीं डाल सकते हैं), यह पूरी तरह से व्यर्थ है - यहां तक ​​कि एक सामान्य योजना का एक विशेष मामला - सी ++ में 1 1।


परिशिष्ट, दिसम्बर 22 2013:

मानक <CX> हैडर, जो बारी में करने के मामले में परिभाषित किया गया है के संदर्भ में एक सी ++ सी हैडर <Xh> हैडर को परिभाषित करता है संबंधित सी लाइब्रेरी हेडर।

सी ++ 11 §D.5/2:

“ हर सी हैडर, जिनमें से प्रत्येक प्रपत्र name.h का एक नाम है, जैसे कि बर्ताव करता है प्रत्येक नाम मानक पुस्तकालय नाम स्थान में रखा संबंधित cname शीर्षलेख वैश्विक नामस्थान क्षेत्र के भीतर रखा गया है। ”

सी ++ 11 §D.5/3 (गैर प्रामाणिक उदाहरण):

“ हैडर <cstdlib> विश्वासपूर्वक नाम स्थान std के भीतर अपनी घोषणाओं और परिभाषाओं प्रदान करता है। यह इन नामों को वैश्विक नामस्थान के भीतर भी प्रदान कर सकता है। शीर्षलेख <stdlib.h> वैश्विक नामस्थान के भीतर ही वही घोषणाएं और परिभाषाएं प्रदान करता है, जितना सी मानक में उतना ही है। यह इन नामों को नामस्थान std के भीतर भी प्रदान कर सकता है। ”

स्टैक ओवरफ़्लो उपयोगकर्ता C.R. ’ टिप्पणी मुझे पता है कि इस तरह के कर दिया MinGW जी ++ 4.7 के रूप में ग्राम के कुछ संस्करणों ++।2, <X.h> शीर्षकों के संबंध में गैर मानक हैं, उदाहरण के अधिभार की कमी sin सी ++ मानक की आवश्यकता है कि:

मैं पहले से ही जानता था कि MinGW जी ++ 4.7.2 भी पूरी तरह से इस तरह के कार्यों swprintf के रूप में अभाव है, और यह शुद्ध सी ++ पुस्तकालय जैसे C++ 11 std::to_string कमी के रूप में में डिट्टो कमियों है। हालांकि, सी फंक्शन ओवरलोड की कमी के बारे में जानकारी मेरे लिए नई थी।

व्यवहार में जी ++ के साथ कमी भार के मतलब है

  • जी ++ मुद्दा, या

  • लापता जी का उपयोग कर ++ भार के परहेज,
    जैसे अनदेखी केवल double sin(double), या

  • का उपयोग कर std नाम स्थान का उपयोग कर overloads
    (एक तो जी के साथ उनकी उपस्थिति ++ गारंटी करने के लिए <cmath> शामिल करने के लिए की जरूरत है)।

क्रम जी ++ std नाम स्थान का उपयोग करने के अयोग्य overloads, एक व्यावहारिक दृष्टिकोण हेडर इस संकलक के लिए रैपर परिभाषित करने के लिए है। मैंने g ++ कमियों को संबोधित करने के लिए उस दृष्टिकोण का उपयोग किया है। printf परिवार के लिए। क्योंकि डेविड व्हीलर ने एक बार टिप्पणी की, “ कंप्यूटर विज्ञान में सभी समस्याओं को संकेत के दूसरे स्तर से हल किया जा सकता है ” और नरक;

फिर चीजों को व्यवस्थित किया जा सकता है ताकि मानक कोड जो g ++ के गायब ओवरलोड का उपयोग करता है, भी g ++ के साथ संकलित करता है। यह निश्चित मात्रा में कोड के साथ मानक को संकलक समायोजित करता है।

+0

व्याख्या करने के लिए धन्यवाद! :) – Jane

+0

मैं विजुअल स्टूडियो 10 प्रोफेशनल का उपयोग कर रहा हूं। क्या आपका मतलब है कि का उपयोग के बजाय बेहतर है? – Jane

+0

यह अधिक सार्थक है और [* .h] हेडर (सी लाइब्रेरी के संबंध में) का सामान्य अभ्यास कोड को थोड़ा अधिक मजबूत बनाता है, अन्य कंपेलरों के साथ समस्याग्रस्त होने की संभावना कम होती है। –

0

assert.h एक मैक्रो फ़ंक्शन को परिभाषित करता है जिसे मानक डीबगिंग टूल के रूप में उपयोग किया जा सकता है।

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