Aracılığıyla paylaş


_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 (trueişaretçi ifadeleri dahil).

message
Raporun bir parçası olarak görüntülenecek geniş bir dize.

Açıklamalar

_ASSERT_EXPRve _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 _CrtDbgReportWtü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. _RPThata _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_EXPRda, 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 _ASSERTstring1 == string2test 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