जवाबों:
एक हैक जो मैंने देखा है वह &&
ऑपरेटर का उपयोग करना है। चूंकि एक पॉइंटर "सच है" यदि यह गैर-अशक्त है, तो आप स्थिति में बदलाव किए बिना निम्नलिखित कर सकते हैं:
assert(a == b && "A is not equal to B");
चूंकि assert
जो स्थिति विफल रही, वह आपके संदेश को भी प्रदर्शित करेगी। यदि यह पर्याप्त नहीं है, तो आप अपना स्वयं का myAssert
फ़ंक्शन या मैक्रो लिख सकते हैं, जो आप चाहते हैं।
assert(("A must be equal to B", a == b));
assert(a == b && "A (" << A << ") is not equal to B (" << B << ")");
printf
अगर कुछ भी छापता है तो एक गैर-शून्य मान लौटाता है, इसलिए आप कुछ ऐसा कर सकते हैं assert(a == b && printf("a (%i) is not equal to b (%i)", a, b))
, हालांकि उस बिंदु पर आपको संभवतः अपना स्वयं का आवरण लिखना चाहिए।
एक अन्य विकल्प ऑपरेंड्स को उल्टा करना और कॉमा ऑपरेटर का उपयोग करना है। आपको अतिरिक्त कोष्ठक की आवश्यकता है, इसलिए अल्पविरामों को तर्कों के बीच एक सीमांकक के रूप में नहीं माना जाता है:
assert(("A must be equal to B", a == b));
(यह बेहतर दृश्यता के लिए उपरोक्त टिप्पणियों से कॉपी किया गया था)
#define m_assert(expr, msg) assert(( (void)(msg), (expr) ))
यहाँ मुखर मैक्रो का मेरा संस्करण है, जो संदेश को स्वीकार करता है और सब कुछ स्पष्ट तरीके से प्रिंट करता है:
#include <iostream>
#ifndef NDEBUG
# define M_Assert(Expr, Msg) \
__M_Assert(#Expr, Expr, __FILE__, __LINE__, Msg)
#else
# define M_Assert(Expr, Msg) ;
#endif
void __M_Assert(const char* expr_str, bool expr, const char* file, int line, const char* msg)
{
if (!expr)
{
std::cerr << "Assert failed:\t" << msg << "\n"
<< "Expected:\t" << expr_str << "\n"
<< "Source:\t\t" << file << ", line " << line << "\n";
abort();
}
}
अब, आप इसका उपयोग कर सकते हैं
M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");
और विफलता के मामले में आपको इस तरह एक संदेश मिलेगा:
मुखर विफल: MyFunction: को गैर-अशक्त तर्क की आवश्यकता है
उम्मीद: ptr! = Nullptr
स्रोत: C: \ MyProject \ src.cpp, पंक्ति 22
अच्छा और साफ, अपने कोड में इसका उपयोग करने के लिए स्वतंत्र महसूस करें =)
x == y
। तब Expr में विस्तार होगा if( !(x == y))
और यह वह जगह है जहाँ स्थिति की जाँच की जाती है, और #Expr स्ट्रिंग शाब्दिक में विस्तारित होगी "x == y"
, जिसे हम फिर त्रुटि संदेश में डालते हैं।
BOOST_ASSERT_MSG(expre, msg)
http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html
आप या तो सीधे उपयोग कर सकते हैं या बूस्ट कोड को कॉपी कर सकते हैं। यह भी ध्यान दें कि बूस्ट एस्टर केवल हेडर है, इसलिए यदि आप सभी बूस्ट को स्थापित नहीं करना चाहते हैं, तो आप उस सिंगल फाइल को ले सकते हैं।
जैसा कि zneak का उत्तर कोड को कुछ हद तक समझाता है, एक बेहतर तरीका यह है कि आप जिस स्ट्रिंग टेक्स्ट के बारे में बात कर रहे हैं, उस पर टिप्पणी करें। अर्थात।:
assert(a == b); // A must be equal to B
चूँकि एसेरर एरर का रीडर एरर मैसेज से किसी भी तरह फाइल और लाइन को देखेगा, वे यहाँ पूरा विवरण देखेंगे।
क्योंकि, दिन के अंत में, यह:
assert(number_of_frames != 0); // Has frames to update
इससे बेहतर पढ़ता है:
assert(number_of_frames != 0 && "Has frames to update");
कोड के मानव पार्सिंग के संदर्भ में। पठनीयता। साथ ही लैंग्वेज हैक भी नहीं।
मुखर मैक्रो / फ़ंक्शन संयोजन है। आप अपने स्वयं के फ़ंक्शन के साथ अपने स्वयं के मैक्रो / फ़ंक्शन, उपयोग , आदि को परिभाषित कर सकते हैं __FILE__
, जो एक कस्टम संदेश लेता है__BASE_FILE__
__LINE__