_ASSERT
, , _ASSERTE
_ASSERT_EXPR
makra
Vyhodnoťte výraz a vygenerujte sestavu ladění, pokud je false
výsledek (pouze ladicí verze).
Syntaxe
// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
Parametry
booleanExpression
Skalární výraz (včetně výrazů ukazatele), který se vyhodnotí jako nenulový (true
) nebo 0 (false
).
message
Široký řetězec, který se má zobrazit jako součást sestavy.
Poznámky
_ASSERT
_ASSERTE
Makra _ASSERT_EXPR
poskytují aplikaci čistým a jednoduchým mechanismem pro kontrolu předpokladů během procesu ladění. Jsou flexibilní, protože nemusí být uzavřeny do #ifdef
příkazů, aby se zabránilo jejich zavolání v maloobchodním buildu aplikace. Tato flexibilita se dosahuje pomocí _DEBUG
makra. _ASSERT_EXPR
_ASSERT
a _ASSERTE
jsou k dispozici pouze v případě, že _DEBUG
je definován v době kompilace. Pokud _DEBUG
není definováno, volání těchto maker se během předběžného zpracování odeberou.
_ASSERT_EXPR
_ASSERT
a _ASSERTE
vyhodnotí jejich booleanExpression
argument a když je false
výsledek (0), vytisknou diagnostickou zprávu a zavolá_CrtDbgReportW
, aby vygenerovala ladicí sestavu. Makro _ASSERT
vytiskne jednoduchou diagnostickou zprávu, _ASSERTE
obsahuje řetězcovou reprezentaci neúspěšného výrazu ve zprávě a _ASSERT_EXPR
obsahuje message
řetězec v diagnostické zprávě. Tato makra nedělají nic, když booleanExpression
se vyhodnotí jako nenulová.
_ASSERT_EXPR
_ASSERT
a _ASSERTE
vyvolání _CrtDbgReportW
, což způsobí, že všechny výstupy budou široké znaky. _ASSERTE
správně vytiskne znaky Unicode a booleanExpression
_ASSERT_EXPR
vytiskne znaky Unicode v message
.
_ASSERTE
Vzhledem k tomu, že makro určuje chybný výraz a _ASSERT_EXPR
umožňuje zadat zprávu ve vygenerované sestavě, umožní uživatelům identifikovat problém bez odkazování na zdrojový kód aplikace. Nevýhodou však je, že každý message
vytištěný _ASSERT_EXPR
a každý výraz vyhodnocený _ASSERTE
pomocí je součástí výstupního souboru (verze ladění) vaší aplikace jako řetězcová konstanta. Proto pokud se provede velký počet volání nebo _ASSERT_EXPR
_ASSERTE
, tyto výrazy mohou výrazně zvětšit velikost výstupního souboru.
Pokud nezadáte jinak s funkcemi _CrtSetReportMode
, _CrtSetReportFile
zobrazí se zprávy v automaticky otevíraných otevíraných oknech, které odpovídá nastavení:
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReportW
generuje ladicí sestavu a určuje její cíl nebo cíle na základě aktuálního režimu sestavy nebo režimů a souboru definovaného _CRT_ASSERT
pro typ sestavy. Ve výchozím nastavení se chyby kontrolních výrazů a chyb směrují do okna zprávy ladění. _CrtSetReportFile
Funkce _CrtSetReportMode
slouží k definování cílů pro každý typ sestavy.
Když je cílem okno zprávy ladění a uživatel vybere tlačítko Opakovat, _CrtDbgReportW
vrátí hodnotu 1, což způsobí_ASSERT_EXPR
_ASSERT
, že _ASSERTE
makra spustí ladicí program, pokud je povolené ladění za běhu (JIT).
Další informace o procesu vytváření sestav naleznete v tématu _CrtDbgReport
, _CrtDbgReportW
funkce. Další informace o řešení selhání kontrolních výrazů a použití těchto maker jako mechanismu zpracování chyb ladění naleznete v tématu Makra pro hlášení.
Kromě _ASSERT
maker je možné makro použít k ověření logiky assert
programu. Toto makro je k dispozici ve verzích knihoven ladění i vydané verze. Makra _RPT
ladění _RPTF
jsou k dispozici také pro generování sestavy ladění, ale nevyhodnocují výraz. Makra _RPT
generují jednoduchou sestavu. Makra _RPTF
zahrnují zdrojový soubor a číslo řádku, ve kterém bylo makro sestavy volána ve vygenerované sestavě. K dispozici jsou široké verze znaků těchto maker (_RPTW
, _RPTFW
). Široké verze znaků jsou identické s úzkými verzemi znaků s tím rozdílem, že široké řetězce znaků se používají pro všechny parametry řetězce a výstup.
I když _ASSERT_EXPR
a jsou makra a _ASSERTE
jsou k dispozici zahrnutím <crtdbg.h>
, aplikace musí propojit s ladicí verzí knihovny runtime jazyka C, pokud _DEBUG
je definována, protože tato makra volají jiné funkce _ASSERT
runtime.
Požadavky
Makro | Požadovaný hlavičkový soubor |
---|---|
_ASSERT_EXPR , , _ASSERT _ASSERTE |
<crtdbg.h> |
Příklad
V tomto programu jsou volány do _ASSERT
maker a _ASSERTE
testovat podmínku string1 == string2
. Pokud podmínka selže, tato makra vytisknou diagnostickou zprávu. V _RPT
tomto programu se také provádí skupina maker a _RPTF
jejich skupina jako alternativa k printf
funkci.
// crt_ASSERT_macro.c
// compile with: /D_DEBUG /MTd /Od /Zi /link /verbose:lib /debug
//
// This program uses the _ASSERT and _ASSERTE debugging macros.
//
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
int main()
{
char *p1, *p2;
// The Reporting Mode and File must be specified
// before generating a debug report via an assert
// or report macro.
// This program sends all report types to STDOUT.
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
// Allocate and assign the pointer variables.
p1 = (char *)malloc(10);
strcpy_s(p1, 10, "I am p1");
p2 = (char *)malloc(10);
strcpy_s(p2, 10, "I am p2");
// Use the report macros as a debugging
// warning mechanism, similar to printf.
// Use the assert macros to check if the
// p1 and p2 variables are equivalent.
// If the expression fails, _ASSERTE will
// include a string representation of the
// failed expression in the report.
// _ASSERT does not include the
// expression in the generated report.
_RPT0(_CRT_WARN,
"Use the assert macros to evaluate the expression p1 == p2.\n");
_RPTF2(_CRT_WARN, "\n Will _ASSERT find '%s' == '%s' ?\n", p1, p2);
_ASSERT(p1 == p2);
_RPTF2(_CRT_WARN, "\n\n Will _ASSERTE find '%s' == '%s' ?\n",
p1, p2);
_ASSERTE(p1 == p2);
_RPT2(_CRT_ERROR, "'%s' != '%s'\n", p1, p2);
free(p2);
free(p1);
return 0;
}
Use the assert macros to evaluate the expression p1 == p2.
crt_ASSERT_macro.c(54) :
Will _ASSERT find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(55) : Assertion failed!
crt_ASSERT_macro.c(58) :
Will _ASSERTE find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2
'I am p1' != 'I am p2'
Viz také
Rutiny ladění
assert
Makro, _assert
, _wassert
_RPT
, , _RPTF
_RPTW
, _RPTFW
makra