Udostępnij za pośrednictwem


_ASSERT, , _ASSERTE_ASSERT_EXPR makra

Oceń wyrażenie i wygeneruj raport debugowania, gdy wynik to false (tylko wersja debugowania).

Składnia

// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );

Parametry

booleanExpression
Wyrażenie skalarne (w tym wyrażenia wskaźnika), które daje w wyniku wartość niezerową (true) lub 0 (false).

message
Szeroki ciąg do wyświetlenia w ramach raportu.

Uwagi

_ASSERT Makra _ASSERT_EXPRi _ASSERTE zapewniają aplikacji czysty i prosty mechanizm sprawdzania założeń podczas procesu debugowania. Są one elastyczne, ponieważ nie muszą być ujęte w #ifdef instrukcje, aby zapobiec wywoływaniu ich w kompilacji detalicznej aplikacji. Ta elastyczność jest osiągana przy użyciu makra _DEBUG . _ASSERT_EXPR_ASSERT, i _ASSERTE są dostępne tylko wtedy, gdy _DEBUG jest zdefiniowany w czasie kompilacji. Gdy _DEBUG nie jest zdefiniowana, wywołania tych makr są usuwane podczas wstępnego przetwarzania.

_ASSERT_EXPR, _ASSERT i _ASSERTE oceniają ich booleanExpression argument i gdy wynik to false (0), wyświetlają komunikat diagnostyczny i wywołają _CrtDbgReportW polecenie w celu wygenerowania raportu debugowania. Makro _ASSERT wyświetla prosty komunikat diagnostyczny, _ASSERTE zawiera ciąg reprezentujący wyrażenie, które nie powiodło się w komunikacie, i _ASSERT_EXPR zawiera message ciąg w komunikacie diagnostycznym. Te makra nie robią nic, gdy booleanExpression ocenia się je jako niezerowe.

_ASSERT_EXPR, _ASSERT i _ASSERTE wywołaj _CrtDbgReportWmetodę , co powoduje, że wszystkie dane wyjściowe mają szerokie znaki. _ASSERTE poprawnie drukuje znaki Unicode i booleanExpression _ASSERT_EXPR drukuje znaki Unicode w pliku message.

_ASSERTE Ponieważ makro określa wyrażenie nie powiodło się i _ASSERT_EXPR umożliwia określenie komunikatu w wygenerowanym raporcie, umożliwiają użytkownikom zidentyfikowanie problemu bez odwoływania się do kodu źródłowego aplikacji. Jednak wadą jest to, że każde message wydrukowane przez _ASSERT_EXPR i każde wyrażenie oceniane przez _ASSERTE jest zawarte w pliku wyjściowym (wersja debugowania) aplikacji jako stałej ciągu. W związku z tym, jeśli duża liczba wywołań jest wysyłana do _ASSERT_EXPR lub _ASSERTE, wyrażenia te mogą znacznie zwiększyć rozmiar pliku wyjściowego.

Jeśli nie określisz inaczej funkcji _CrtSetReportMode i _CrtSetReportFile , komunikaty są wyświetlane w oknie podręcznym odpowiadającym ustawieniu:

_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReportW generuje raport debugowania i określa jego miejsce docelowe lub docelowe na podstawie bieżącego trybu raportu lub trybów i pliku zdefiniowanego _CRT_ASSERT dla typu raportu. Domyślnie błędy asercji i błędy są kierowane do okna komunikatu debugowania. Funkcje _CrtSetReportMode i _CrtSetReportFile służą do definiowania miejsc docelowych dla każdego typu raportu.

Gdy miejsce docelowe jest oknem komunikatu debugowania, a użytkownik wybierze przycisk Ponów próbę, _CrtDbgReportW zwraca wartość 1, co powoduje _ASSERT_EXPR_ASSERT uruchomienie debugera i _ASSERTE , jeśli debugowanie just in time (JIT) jest włączone.

Aby uzyskać więcej informacji na temat procesu raportowania _CrtDbgReport, zobacz funkcję , _CrtDbgReportW . Aby uzyskać więcej informacji na temat rozwiązywania błędów asercji i używania tych makr jako mechanizmu obsługi błędów debugowania, zobacz Makra do raportowania.

_ASSERT Oprócz makr assert makro może służyć do weryfikowania logiki programu. To makro jest dostępne zarówno w wersjach debugowania, jak i wydania bibliotek. _RPTF Makra _RPTdebugowania są również dostępne do generowania raportu debugowania, ale nie oceniają wyrażenia. Makra _RPT generują prosty raport. Makra _RPTF zawierają plik źródłowy i numer wiersza, w którym makro raportu zostało wywołane w wygenerowanych raportach. Dostępne są szerokie wersje znaków tych makr (_RPTW, _RPTFW). Wersje znaków szerokich są identyczne z wąskimi wersjami znaków, z wyjątkiem tego, że szerokie ciągi znaków są używane dla wszystkich parametrów i danych wyjściowych ciągu.

Mimo że _ASSERT_EXPRprogram i są makrami i _ASSERTE są dostępne za pomocą <crtdbg.h>funkcji , aplikacja musi łączyć się z wersją debugowania biblioteki środowiska uruchomieniowego języka C, gdy _DEBUG jest zdefiniowana, ponieważ te makra nazywają inne funkcje czasu _ASSERT wykonywania.

Wymagania

Makro Wymagany nagłówek
_ASSERT_EXPR, , _ASSERT_ASSERTE <crtdbg.h>

Przykład

W tym programie wywołania są wykonywane do _ASSERT makr i _ASSERTE w celu przetestowania warunku string1 == string2. Jeśli warunek zakończy się niepowodzeniem, te makra wyświetlą komunikat diagnostyczny. Grupa _RPT makr i _RPTF jest również wykonywana w tym programie, jako alternatywa dla printf funkcji.

// 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'

Zobacz też

Procedury debugowania
assert Makro, _assert, _wassert
_RPT, , _RPTF, _RPTW, _RPTFW makra