assert
makro, _assert
, _wassert
Vyhodnotí výraz a při výsledku false
vytiskne 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