assert
makro, _assert
, _wassert
Oblicza wyrażenie i, gdy wynik to false
, wyświetla komunikat diagnostyczny i przerywa program.
Składnia
assert(
expression
);
void _assert(
char const* message,
char const* filename,
unsigned line
);
void _wassert(
wchar_t const* message,
wchar_t const* filename,
unsigned line
);
Parametry
expression
Wyrażenie skalarne (w tym wyrażenia wskaźnika), które daje w wyniku wartość niezerową (true
) lub 0 (false
).
message
Widomość do wyświetlenia.
filename
Nazwa pliku źródłowego asercji nie powiodła się.
line
Numer wiersza w pliku źródłowym potwierdzenia, który zakończył się niepowodzeniem.
Uwagi
Makro assert
jest zwykle używane do identyfikowania błędów logiki podczas opracowywania programu. Służy do zatrzymywania wykonywania programu w przypadku wystąpienia nieoczekiwanych warunków przez zaimplementowanie argumentu expression
w celu false
oceny tylko wtedy, gdy program działa niepoprawnie. Sprawdzanie asercji można wyłączyć w czasie kompilacji, definiując makro NDEBUG
. Makro można wyłączyć assert
bez modyfikowania plików źródłowych przy użyciu /DNDEBUG
opcji wiersza polecenia. Makro można wyłączyć assert
w kodzie źródłowym, używając dyrektywy przed <assert.h>
jej włączeniem#define NDEBUG
.
Makro assert
wyświetla komunikat diagnostyczny podczas expression
oceniania wartości false
(0) i wywołuje polecenie abort
zatrzymania wykonywania programu. Nie jest podejmowana żadna akcja, jeśli expression
jest true
(niezerowa). Komunikat diagnostyczny zawiera wyrażenie, które zakończyło się niepowodzeniem, nazwę pliku źródłowego i numer wiersza, w którym asercji nie powiodło się.
Komunikat diagnostyczny jest drukowany w szerokich (wchar_t
) znakach. W związku z tym będzie działać zgodnie z oczekiwaniami, nawet jeśli w wyrażeniu znajdują się znaki Unicode.
Miejsce docelowe komunikatu diagnostycznego zależy od typu aplikacji, która nazwała procedurę. Aplikacje konsolowe odbierają komunikat za pośrednictwem .stderr
W aplikacji opartej na systemie Windows wywołuje funkcję systemu WindowsMessageBox
, aby utworzyć pole komunikatu w assert
celu wyświetlenia komunikatu z trzema przyciskami: Przerwanie, Ponów próbę i Ignoruj. Jeśli użytkownik wybierze opcję Przerwanie, program natychmiast przerywa. Jeśli użytkownik wybierze opcję Ponów próbę, zostanie wywołany debuger, a użytkownik może debugować program, jeśli debugowanie just in time (JIT) jest włączone. Jeśli użytkownik wybierze opcję Ignoruj, program będzie kontynuować normalne wykonywanie. Kliknięcie pozycji Ignoruj , gdy istnieje warunek błędu, może spowodować niezdefiniowane zachowanie, ponieważ warunki wstępne kodu wywołującego nie zostały spełnione.
Aby zastąpić domyślne zachowanie danych wyjściowych niezależnie od typu aplikacji, wywołaj metodę _set_error_mode
, aby wybrać między zachowaniem output-to-stderr i display-dialog-box.
Po assert
wyświetleniu komunikatu wywołuje abort
metodę , która wyświetla okno dialogowe z przyciskami Przerwanie, Ponów próbę i Ignoruj . abort
kończy działanie programu, więc przycisk Ponów próbę i Ignoruj nie wznowi wykonywania programu po wywołaniu assert
. Jeśli assert
zostanie wyświetlone okno dialogowe, abort
okno dialogowe nie jest wyświetlane. Jedynym czasem wyświetlania okna dialogowego abort
jest assert
wysłanie danych wyjściowych do narzędzia stderr.
W wyniku powyższego zachowania okno dialogowe jest zawsze wyświetlane po assert
wywołaniu w trybie debugowania. Zachowanie każdego przycisku jest przechwytywane w poniższej tabeli.
Tryb błędu | Dane wyjściowe do stderr (konsola/_OUT_TO_STDERR ) |
Wyświetlanie okna dialogowego (Windows/_OUT_TO_MSGBOX ) |
---|---|---|
Abort |
Zamknij natychmiast z kodem zakończenia 3 | Zamknij natychmiast z kodem zakończenia 3 |
Retry |
Włamuj się do debugera podczas abort |
Włamuj się do debugera podczas assert |
Ignore |
Kończenie zamykania za pośrednictwem abort |
Kontynuuj program tak, jakby assert nie został wyzwolony (może spowodować niezdefiniowane zachowanie, ponieważ warunki wstępne kodu wywołującego nie zostały spełnione) |
Aby uzyskać więcej informacji na temat debugowania CRT, zobacz Techniki debugowania CRT.
Funkcje _assert
i _wassert
to wewnętrzne funkcje CRT. Pomagają zminimalizować kod wymagany w plikach obiektów do obsługi asercji. Nie zalecamy bezpośredniego wywoływania tych funkcji.
Makro assert
jest włączone zarówno w wersjach, jak i w wersjach debugowania bibliotek czasu wykonywania języka C, gdy NDEBUG
nie jest zdefiniowane. Po NDEBUG
zdefiniowaniu makro jest dostępne, ale nie ocenia argumentu i nie ma żadnego efektu. Po jej włączeniu assert
makro wywołuje _wassert
implementację. Dostępne są również inne makra _ASSERT
asercji i _ASSERTE
_ASSERT_EXPR
, ale oceniają wyrażenia przekazywane tylko wtedy, gdy _DEBUG
makro zostało zdefiniowane i gdy znajdują się w kodzie połączonym z wersją debugowania bibliotek czasu wykonywania języka C.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
assert , _wassert |
<assert.h> |
Podpis _assert
funkcji nie jest dostępny w pliku nagłówka. Podpis _wassert
funkcji jest dostępny tylko wtedy, gdy NDEBUG
makro nie jest zdefiniowane.
Przykład
W tym programie funkcja używa makra analyze_string
do testowania assert
kilku warunków związanych z ciągiem i długością. Jeśli którykolwiek z warunków zakończy się niepowodzeniem, program wyświetli komunikat wskazujący, co spowodowało awarię.
// crt_assert.c
// compile by using: cl /W4 crt_assert.c
#include <stdio.h>
#include <assert.h>
#include <string.h>
void analyze_string( char *string ); // Prototype
int main( void )
{
char test1[] = "abc", *test2 = NULL, test3[] = "";
printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
analyze_string( test1 );
printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
analyze_string( test2 );
printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
analyze_string( test3 );
}
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
assert( string != NULL ); // Cannot be NULL
assert( *string != '\0' ); // Cannot be empty
assert( strlen( string ) > 2 ); // Length must exceed 2
}
Program generuje następujące dane wyjściowe:
Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25
Po niepowodzeniu asercji w zależności od wersji systemu operacyjnego i biblioteki czasu wykonywania może zostać wyświetlone pole komunikatu zawierające coś podobnego do następującego:
A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.
Jeśli debuger jest zainstalowany, wybierz przycisk Debuguj, aby uruchomić debuger lub Zamknij program, aby zakończyć.
Zobacz też
Obsługa błędów
Kontrola procesu i środowiska
abort
raise
signal
_ASSERT
, , _ASSERTE
_ASSERT_EXPR
makra
_DEBUG