_ASSERT
, _ASSERTE
, _ASSERT_EXPR
Makrolar
Bir ifadeyi değerlendirin ve sonuç false
olduğunda bir hata ayıklama raporu oluşturun (yalnızca hata ayıklama sürümü).
Sözdizimi
// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
Parametreler
booleanExpression
Sıfır olmayan () veya 0false
( olarak değerlendirilen bir skaler ifade (true
işaretçi ifadeleri dahil).
message
Raporun bir parçası olarak görüntülenecek geniş bir dize.
Açıklamalar
_ASSERT_EXPR
ve _ASSERTE
makroları, _ASSERT
bir uygulamaya hata ayıklama işlemi sırasında varsayımları denetlemek için temiz ve basit bir mekanizma sağlar. Esnektirler çünkü bir uygulamanın perakende derlemesinde #ifdef
çağrılmalarını önlemek için deyimlerin içine alınmaları gerekmez. Bu esneklik, makro kullanılarak _DEBUG
elde edilir. _ASSERT_EXPR
_ASSERT
ve _ASSERTE
yalnızca derleme zamanında tanımlandığında _DEBUG
kullanılabilir. Tanımlanmadığında _DEBUG
, bu makrolara yapılan çağrılar ön işleme sırasında kaldırılır.
_ASSERT_EXPR
_ASSERTE
ve _ASSERT
bağımsız değişkenlerini booleanExpression
değerlendirir ve sonuç (0) olduğunda false
bir tanılama iletisi yazdırır ve hata ayıklama raporu oluşturmak için çağrısı _CrtDbgReportW
yaparlar. Makro _ASSERT
basit bir tanılama iletisi yazdırır, _ASSERTE
iletideki başarısız ifadenin dize gösterimini içerir ve _ASSERT_EXPR
dizeyi message
tanılama iletisine ekler. Bu makrolar sıfır olmayan olarak değerlendirildiğinde booleanExpression
hiçbir şey yapmaz.
_ASSERT_EXPR
_ASSERTE
ve _ASSERT
çağırarak _CrtDbgReportW
tüm çıkışın geniş karakterlerde olmasını sağlayın. _ASSERTE
içinde booleanExpression
Unicode karakterlerini düzgün yazdırır ve _ASSERT_EXPR
içindeki Unicode karakterlerini yazdırır message
.
_ASSERTE
Makro başarısız ifadeyi belirttiğinden ve _ASSERT_EXPR
oluşturulan raporda bir ileti belirtmenize olanak sağladığından, kullanıcıların uygulama kaynak koduna başvurmadan sorunu tanımlamasına olanak tanır. Ancak, tarafından yazdırılan _ASSERT_EXPR
ve tarafından değerlendirilen _ASSERTE
her message
ifadenin uygulamanızın çıkış (hata ayıklama sürümü) dosyasına dize sabiti olarak eklenmesinin bir dezavantajı vardır. Bu nedenle, veya _ASSERTE
öğesine çok sayıda çağrı yapılırsa_ASSERT_EXPR
, bu ifadeler çıkış dosyanızın boyutunu büyük ölçüde artırabilir.
ve _CrtSetReportFile
işlevleriyle _CrtSetReportMode
aksini belirtmediğiniz sürece, iletiler aşağıdaki ayarlara eşdeğer bir açılır iletişim kutusunda görünür:
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReportW
hata ayıklama raporunu oluşturur ve geçerli rapor moduna veya rapor türü için tanımlanan modlara ve dosyaya _CRT_ASSERT
göre hedefini veya hedeflerini belirler. Varsayılan olarak, onay hataları ve hataları bir hata ayıklama iletisi penceresine yönlendirilir. _CrtSetReportMode
ve _CrtSetReportFile
işlevleri, her rapor türünün hedeflerini tanımlamak için kullanılır.
Hedef bir hata ayıklama iletisi penceresi olduğunda ve kullanıcı Yeniden Dene düğmesini seçtiğinde 1 döndürür ve _ASSERTE
tam zamanında (JIT) hata ayıklama etkinse makroların hata ayıklayıcıyı başlatmasına neden _ASSERT_EXPR
_ASSERT
_CrtDbgReportW
olur.
Raporlama işlemi hakkında daha fazla bilgi için, işlevine _CrtDbgReport
_CrtDbgReportW
bakın. Onay hatalarını çözme ve bu makroları hata ayıklama hata işleme mekanizması olarak kullanma hakkında daha fazla bilgi için bkz . Raporlama için makrolar.
Makrolara _ASSERT
ek olarak, assert
makro program mantığını doğrulamak için kullanılabilir. Bu makro, kitaplıkların hem hata ayıklama hem de sürüm sürümlerinde kullanılabilir. _RPT
hata _RPTF
ayıklama makroları, hata ayıklama raporu oluşturmak için de kullanılabilir, ancak bir ifadeyi değerlendirmez. Makrolar _RPT
basit bir rapor oluşturur. Makrolar, _RPTF
rapor makrosunun oluşturulan raporda çağrıldığı kaynak dosyayı ve satır numarasını içerir. Bu makroların geniş karakter sürümleri kullanılabilir (_RPTW
, _RPTFW
). Geniş karakter sürümleri, tüm dize parametreleri ve çıkışı için geniş karakter dizelerinin kullanılması dışında dar karakter sürümleriyle aynıdır.
ve _ASSERT
_ASSERTE
makrolar olsa da ve dahil <crtdbg.h>
ederek kullanılabilir olsa _ASSERT_EXPR
da, bu makrolar diğer çalışma zamanı işlevlerini çağırdığından uygulama tanımlandığında _DEBUG
C çalışma zamanı kitaplığının hata ayıklama sürümüyle bağlantı oluşturmalıdır.
Gereksinimler
Makro | Gerekli başlık |
---|---|
_ASSERT_EXPR , _ASSERT , _ASSERTE |
<crtdbg.h> |
Örnek
Bu programda, koşulunu _ASSERT
string1 == string2
test etmek için ve _ASSERTE
makrolarına çağrılar yapılır. Koşul başarısız olursa, bu makrolar bir tanılama iletisi yazdırır. ve _RPT
_RPTF
makro grubu da bu programda işleve printf
alternatif olarak kullanılır.
// crt_ASSERT_macro.c
// compile with: /D_DEBUG /MTd /Od /Zi /link /verbose:lib /debug
//
// This program uses the _ASSERT and _ASSERTE debugging macros.
//
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
int main()
{
char *p1, *p2;
// The Reporting Mode and File must be specified
// before generating a debug report via an assert
// or report macro.
// This program sends all report types to STDOUT.
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
// Allocate and assign the pointer variables.
p1 = (char *)malloc(10);
strcpy_s(p1, 10, "I am p1");
p2 = (char *)malloc(10);
strcpy_s(p2, 10, "I am p2");
// Use the report macros as a debugging
// warning mechanism, similar to printf.
// Use the assert macros to check if the
// p1 and p2 variables are equivalent.
// If the expression fails, _ASSERTE will
// include a string representation of the
// failed expression in the report.
// _ASSERT does not include the
// expression in the generated report.
_RPT0(_CRT_WARN,
"Use the assert macros to evaluate the expression p1 == p2.\n");
_RPTF2(_CRT_WARN, "\n Will _ASSERT find '%s' == '%s' ?\n", p1, p2);
_ASSERT(p1 == p2);
_RPTF2(_CRT_WARN, "\n\n Will _ASSERTE find '%s' == '%s' ?\n",
p1, p2);
_ASSERTE(p1 == p2);
_RPT2(_CRT_ERROR, "'%s' != '%s'\n", p1, p2);
free(p2);
free(p1);
return 0;
}
Use the assert macros to evaluate the expression p1 == p2.
crt_ASSERT_macro.c(54) :
Will _ASSERT find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(55) : Assertion failed!
crt_ASSERT_macro.c(58) :
Will _ASSERTE find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2
'I am p1' != 'I am p2'
Ayrıca bkz.
Hata ayıklama yordamları
assert
Makro, _assert
, _wassert
_RPT
, _RPTF
, _RPTW
, _RPTFW
Makrolar