Sdílet prostřednictvím


assert makro, _assert, _wassert

Vyhodnotí výraz a při výsledku falsevytiskne diagnostickou zprávu a program přeruší.

Syntaxe

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
Skalární výraz (včetně výrazů ukazatele), který se vyhodnotí jako nenulový (true) nebo 0 (false).

message
Zpráva, která se má zobrazit

filename
Název zdrojového souboru, ve které se kontrolní výraz nezdařil.

line
Číslo řádku ve zdrojovém souboru neúspěšného kontrolního výrazu.

Poznámky

Makro assert se obvykle používá k identifikaci chyb logiky během vývoje programu. Slouží k zastavení provádění programu, pokud dojde k neočekávaným stavům implementací argumentu expression , aby se vyhodnotil false pouze v případě, že program pracuje nesprávně. Kontrolní kontroly lze v době kompilace vypnout definováním makra NDEBUG. Makro můžete vypnout assert beze změny zdrojových souborů pomocí možnosti příkazového /DNDEBUG řádku. Makro ve zdrojovém kódu můžete vypnout assert pomocí #define NDEBUG direktivy před <assert.h> zahrnutím.

Makro assert vytiskne diagnostickou zprávu, když expression se vyhodnotí jako false (0) a volání abort za účelem zastavení provádění programu. Není-li expression true provedena žádná akce (nenulová). Diagnostická zpráva obsahuje neúspěšný výraz, název zdrojového souboru a číslo řádku, kde kontrolní výraz selhal.

Diagnostická zpráva se vytiskne širokými (wchar_t) znaky. Proto bude fungovat podle očekávání i v případě, že výraz obsahuje znaky Unicode.

Cíl diagnostické zprávy závisí na typu aplikace, která volala rutinu. Konzolové aplikace obdrží zprávu prostřednictvím stderr. V aplikaci založené na Systému Windows zavolá funkci Windows, assert která vytvoří okno se zprávou pro zobrazení zprávy se třemi tlačítky: přerušení, opakování a ignorování.MessageBox Pokud uživatel zvolí přerušení, program se okamžitě přeruší. Pokud uživatel zvolí možnost Opakovat, zavolá se ladicí program a uživatel může program ladit, pokud je povolené ladění podle potřeby (JIT). Pokud uživatel zvolí Ignorovat, program bude pokračovat normálním spuštěním. Kliknutí na Ignorovat , pokud existuje chybová podmínka, může způsobit nedefinované chování, protože předpoklady volajícího kódu nebyly splněny.

Chcete-li přepsat výchozí chování výstupu bez ohledu na typ aplikace, volání _set_error_mode pro výběr mezi výstupem-stderr a chováním dialogového okna display-box.

Jakmile assert se zobrazí zpráva, zavolá abort, která zobrazí dialogové okno s tlačítky Přerušit, Opakovat a Ignorovat . abort program ukončí, takže tlačítko Opakovat a Ignorovat nebude pokračovat v provádění programu po assert volání. Pokud assert se zobrazí dialogové okno, abort dialogové okno se nezobrazí. Jediný čas, kdy abort se zobrazí dialogové okno, je odeslání assert výstupu do stderru.

V důsledku výše uvedeného chování se dialogové okno vždy zobrazí po assert volání v režimu ladění. Chování jednotlivých tlačítek je zachyceno v následující tabulce.

Režim chyby Výstup do stderr (konzola/_OUT_TO_STDERR) Dialogové okno Zobrazení (Windows/_OUT_TO_MSGBOX)
Abort Okamžité ukončení s ukončovacím kódem 3 Okamžité ukončení s ukončovacím kódem 3
Retry Rozdělení do ladicího programu během abort Rozdělení do ladicího programu během assert
Ignore Dokončení ukončení prostřednictvím abort Pokračujte v programu, jako by assert se neaktivovalo (může vést k nedefinovanému chování, protože nebyly splněny předpoklady volajícího kódu).

Další informace o ladění CRT naleznete v tématu Techniky ladění CRT.

Funkce _assert a _wassert funkce jsou interní funkce CRT. Pomáhají minimalizovat kód potřebný v souborech objektů pro podporu kontrolních výrazů. Tyto funkce nedoporučujeme volat přímo.

Makro assert je povoleno ve verzích i ladicích verzích knihoven runtime jazyka C, pokud NDEBUG není definováno. Je-li NDEBUG definováno, je makro k dispozici, ale nevyhodnocuje jeho argument a nemá žádný vliv. Když je tato funkce povolená, assert makro volá _wassert její implementaci. K dispozici jsou také další makra kontrolního výrazu _ASSERT_ASSERTE a _ASSERT_EXPR, ale vyhodnocují pouze výrazy předané v případě_DEBUG, že je makro definováno a kdy jsou v kódu propojené s ladicí verzí knihoven runtime jazyka C.

Požadavky

Rutina Požadovaný hlavičkový soubor
assert, _wassert <assert.h>

Podpis _assert funkce není v souboru záhlaví k dispozici. Podpis _wassert funkce je k dispozici pouze v případech, kdy NDEBUG není definováno makro.

Příklad

V tomto programu analyze_string funkce pomocí assert makra otestuje několik podmínek souvisejících s řetězcem a délkou. Pokud některá z podmínek selže, program vytiskne zprávu, která indikuje, co způsobilo selhání.

// 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 vygeneruje tento výstup:

Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25

Po selhání kontrolního výrazu se v závislosti na verzi operačního systému a knihovně runtime může zobrazit okno se zprávou, která obsahuje něco podobného:

A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.

Pokud je nainstalovaný ladicí program, zvolte tlačítko Ladit a spusťte ladicí program nebo ukončete program Zavřít.

Viz také

Zpracování chyb
Řízení procesů a prostředí
abort
raise
signal
_ASSERT, , _ASSERTE_ASSERT_EXPR makra
_DEBUG