Yanıtlar:
Etrafta gördüğüm bir hack &&
operatörü kullanmak . İşaretçi boş değilse "true" olduğundan, koşulu değiştirmeden aşağıdakileri yapabilirsiniz:
assert(a == b && "A is not equal to B");
Yana assert
gösteriler başarısız olduğunu koşulu, çok senin mesajını verir. Yeterli değilse, istediğinizi görüntüleyecek kendi myAssert
işlevinizi veya makronuzu yazabilirsiniz .
assert(("A must be equal to B", a == b));
assert(a == b && "A (" << A << ") is not equal to B (" << B << ")");
printf
herhangi bir şey yazdırırsa sıfır olmayan bir değer döndürür, bu nedenle böyle bir şey yapabilirsiniz assert(a == b && printf("a (%i) is not equal to b (%i)", a, b))
, ancak bu noktada muhtemelen kendi iddia sarmalayıcınızı yazmalısınız.
Diğer bir seçenek, işlenenleri ters çevirmek ve virgül operatörünü kullanmaktır. Ekstra parantezlere ihtiyacınız var, böylece virgül, bağımsız değişkenler arasında bir sınırlayıcı olarak değerlendirilmez:
assert(("A must be equal to B", a == b));
(bu, daha iyi görünürlük için yukarıdaki yorumlardan kopyalandı)
#define m_assert(expr, msg) assert(( (void)(msg), (expr) ))
İletiyi kabul eden ve her şeyi net bir şekilde yazdıran assert makrosu sürümüm:
#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();
}
}
Şimdi bunu kullanabilirsin
M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");
Ve başarısızlık durumunda şöyle bir mesaj alacaksınız:
Onaylama başarısız oldu: MyFunction: boş olmayan bağımsız değişken gerektirir
Beklenen: ptr! = Nullptr
Kaynak: C: \ MyProject \ src.cpp, satır 22
Güzel ve temiz, kodunuzda kullanmaktan çekinmeyin =)
x == y
. Sonra İfade içine genişler if( !(x == y))
ve burası koşulun kontrol edildiği yerdir ve # İfade, "x == y"
daha sonra hata mesajına koyduğumuz dize değişmezine genişler .
BOOST_ASSERT_MSG(expre, msg)
http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html
Bunu doğrudan kullanabilir veya Boost'un kodunu kopyalayabilirsiniz. Ayrıca, Boost assert'in yalnızca başlık olduğunu unutmayın; bu nedenle, tüm Boost'u yüklemek istemiyorsanız, yalnızca o tek dosyayı alabilirsiniz.
Zneak'ın cevabı kodu bir şekilde büktüğü için, daha iyi bir yaklaşım, sadece bahsettiğiniz metin metnini yorumlamaktır. yani .:
assert(a == b); // A must be equal to B
İddia hatasının okuyucusu, hata mesajından dosya ve satırı yine de arayacağından, tam açıklamayı burada göreceklerdir.
Çünkü günün sonunda bu:
assert(number_of_frames != 0); // Has frames to update
bundan daha iyi okur:
assert(number_of_frames != 0 && "Has frames to update");
yani kodun insan ayrıştırılması açısından. okunabilirliği. Ayrıca dil kesmek de değil.
assert bir makro / fonksiyon kombinasyonudur. Eğer kullanarak kendi makro / fonksiyon tanımlayabilir __FILE__
, __BASE_FILE__
, __LINE__
özel bir mesaj alır kendi fonksiyonu ile, vs
Vc için assert.h içine aşağıdaki kodu ekleyin,
#define assert2(_Expression, _Msg) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Msg), _CRT_WIDE(__FILE__), __LINE__), 0) )