Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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_EXPR Makra _ASSERTi _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.
_RPT
_RPTF
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_EXPRprogram i są makrami i _ASSERT są dostępne za pomocą _ASSERTEfunkcji , aplikacja musi łączyć się z wersją debugowania biblioteki środowiska uruchomieniowego języka C, gdy <crtdbg.h> jest zdefiniowana, ponieważ te makra nazywają inne funkcje czasu _DEBUG 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