_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_EXPR
i _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 _CrtDbgReportW
metodę , 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 _RPT
debugowania 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_EXPR
program 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