Udostępnij za pośrednictwem


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 abortmetodę , 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 _ASSERTasercji 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