_ASSERT、_ASSERTE 巨集
結果為 False 時 (僅偵錯版本),評估運算式並產生偵錯報告。
_ASSERT(
booleanExpression
);
_ASSERTE(
booleanExpression
);
參數
- booleanExpression
評估運算式 (包括指標) 為非零或 0。
備註
_ASSERT 和 _ASSERTE 巨集提供應用程式一個在偵錯處理序中檢查假設的乾淨和簡單的機制。 因為它們不必被 #ifdef 陳述式包圍以避免在應用程式的零售版本中被呼叫,因此它們非常彈性。 使用 _DEBUG 巨集來達成這種彈性。 當 _DEBUG 定義之後,_ASSERT 和 _ASSERTE 才可以使用。 當 _DEBUG 沒有定義時,在前置處理中,這些巨集的呼叫將被移除。
_ASSERT 和 _ASSERTE 都評估其 booleanExpression 引數,而且當結果是 false (0),則會列印一個診斷訊息並呼叫 _CrtDbgReportW 產生偵錯報告。 如果 _ASSERTE 在訊息包括失敗的運算式的字串型式表示,_ASSERT 巨集列印一個簡單的診斷資訊。 當 booleanExpression 的評估結果為非零,這些巨集不執行。
_ASSERT 和 _ASSERTE 調用 _CrtDbgReportW,導致以寬字元產生所有輸出,以及 _ASSERTE 正確列印 booleanExpression的 Unicode 字元。
由於 _ASSERTE 巨集在產生的報告指定失敗的運算式,它可讓使用者識別問題,而不用參考應用程式原始程式碼。 不過,缺點是 _ASSERTE 評估的每個運算式都做為字串常數在應用程式的輸出 (偵錯版本) 檔案中。 因此,如果大量呼叫 _ASSERTE,這些運算式可以大幅增加您的輸出檔的大小。
除非您改為指定 _CrtSetReportMode 和 _CrtSetReportFile 函式,訊息會出現在快顯對話方塊相當於設定:
_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReport 或 _CrtDbgReportW 產生偵錯報告並決定其目的地或目標,根據目前的報告模式或是為 _CRT_ASSERT 定義的模式和檔案。 判斷提示失敗和錯誤預設導向至偵錯訊息視窗。 _CrtSetReportMode 和 _CrtSetReportFile 函式定義每個報告類型的目的地。
在 Just-In-Time (JIT) 偵錯已啟用條件下,當目的是偵錯訊息視窗,而且使用者按一下 [重試] 按鈕時, _CrtDbgReport 或 _CrtDbgReportW 會傳回 1,讓 _ASSERT 和 _ASSERTE 巨集啟動偵錯工具。
如需報告程序的詳細資訊,請參閱 _CrtDbgReport, _CrtDbgReportW 函式。 如需解析判斷提示失敗和使用這些巨集的詳細資訊做為偵錯和錯誤處理機制,請參閱 使用驗證和報告的巨集。
_RPT, _RPTF 偵錯巨集來產生偵錯報告也是可用的,但是它們不會執行運算式。 _RPT 巨集產生簡單的報表。 _RPTF 巨集將呼叫的報告呼叫的原始程式檔以及行號包含進產生的報告中。 除了 _ASSERTE 巨集以外, ANSI assert 常式可用來驗證程序邏輯。 這個常式於程式庫的偵錯版本和發行版本可用。 這些巨集的寬字元版本可用 (_RPTWn, _RPTFWn)。 寬字元版本與窄字元版本相同,除了寬字元字串使用於所有字串參數和輸出。
雖然 _ASSERT 和 _ASSERTE 同樣為巨集且都因為包含 Crtdbg.h 而加入,應用程式必須連結至下列程式庫,因為這些巨集呼叫其他執行階段函式。
Libcmtd.lib
多執行緒靜態程式庫,偵錯版本。Msvcrtd.lib
匯入 Msvcr90d.dll 程式庫,偵錯版本。
需求
巨集 |
必要的標頭 |
---|---|
_ASSERT |
<crtdbg.h> |
_ASSERTE |
<crtdbg.h> |
範例
在這個程式,呼叫 _ASSERT 和 _ASSERTE 巨集來測試 string1 == string2 條件。 如果條件失敗,這些巨集列印一個診斷資訊。 巨集的 _RPTn 和 _RPTFn 群組也於此程式執行,做為對 printf 函式的替代方式。
// 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;
}
.NET Framework 對等用法
System::Diagnostics::Debug::Assert