Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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