共用方式為


_Assert 狀況,_asserte 的判斷提示巨集

評估運算式,並且產生偵錯報告,結果是False (偵錯版本)。

_ASSERT( 
   booleanExpression 
);
_ASSERTE( 
   booleanExpression 
);

參數

  • booleanExpression
    運算式 (包括 「 指標 」) 會傳回非零或者是 0。

備註

_ASSERT和_ASSERTE巨集將為應用程式提供清楚又簡單的機制,來檢查在偵錯的程序的假設。 它們是非常大的彈性,因為他們不需要使用括住,所以#ifdef陳述式,以防止它們被呼叫的應用程式的零售版本。 這種彈性的方法是使用 _DEBUG 巨集。 _ASSERT與_ASSERTE ,才可以使用的時機_DEBUG定義。 當_DEBUG是未定義,這些巨集的呼叫會移除在前置處理過程。

_ASSERT與_ASSERTE評估其booleanExpression引數,然後結果就是當false (0),它們均列印診斷訊息和呼叫 _CrtDbgReportW 來產生偵錯報告。 _ASSERT巨集列印簡單的診斷訊息,而_ASSERTE訊息中包含的字串表示失敗的運算式。 這些巨集執行任何動作時booleanExpression會評估為非零值。

_ASSERT與_ASSERTE叫用_CrtDbgReportW,而導致的所有輸出以寬字元為單位,以及_ASSERTE正常列印中的 Unicode 字元booleanExpression。

因為_ASSERTE巨集指定產生的報告中的 [失敗的運算式,它可讓使用者識別問題,而不參照到應用程式的原始程式碼。 然而,一項缺點存在,因為每個運算式評估的_ASSERTE會包含在輸出 (偵錯版本) 檔案,您的應用程式做為字串常數。 因此,如果一大堆進行呼叫時_ASSERTE,這些運算式可以大幅提高您的輸出檔的大小。

除非另外指定,否則以 _CrtSetReportMode_CrtSetReportFile 函數,訊息會出現在快顯對話方塊設定等同於:

_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReport或_CrtDbgReportW產生偵錯報告,並決定它的目的地或根據目前的報表模式或模式及檔案所定義的目的地_CRT_ASSERT報告類型。 預設情況下,判斷提示失敗和錯誤會被導向至偵錯訊息視窗。 _CrtSetReportMode_CrtSetReportFile 函式用來定義每種報表類型的目的地。

當目的地是偵錯訊息視窗和使用者按下再試一次 ] 按鈕, _CrtDbgReport或_CrtDbgReportW ,則傳回 1,造成_ASSERT和_ASSERTE巨集] 以開始偵錯工具,前提是已啟用只是即時 (JIT) 偵錯。

如需有關報告的程序的詳細資訊,請參閱 _CrtDbgReport、 _CrtDbgReportW 函式。 如需有關解決判斷提示失敗,並使用這些巨集,以偵錯錯誤處理機制的詳細資訊,請參閱來進行驗證和報告使用的巨集

_RPT、 _RPTF 偵錯巨集也可用於產生偵錯報告,但它們不會評估運算式。 _RPT巨集產生簡單的報表。 _RPTF巨集產生的報告中包含報表的巨集呼叫的位置的原始程式檔和行號。 除了_ASSERTE巨集,ANSI 判斷提示常式可以用來驗證程式邏輯。 在程式庫的偵錯和發行版本中使用這個常式。 有可用的巨集的寬字元版本 (_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:: 判斷提示

請參閱

參考

偵錯常式

_RPT,_RPTF,_RPTW,_RPTFW 巨集