分享方式:


assert巨集、 、 _assert_wassert

評估運算式;當結果為 false時,列印診斷資訊並中止程式。

語法

assert(
   expression
);
void _assert(
   char const* message,
   char const* filename,
   unsigned line
);
void _wassert(
   wchar_t const* message,
   wchar_t const* filename,
   unsigned line
);

參數

expression
評估為非零 (true) 或 0 (false) 的純量運算式 (包括指標運算式)。

message
要顯示的訊息。

filename
判斷提示失敗之原始程式檔的名稱。

line
判斷提示失敗之原始程式檔中的行號。

備註

assert 巨集通常可用來找出程式開發期間的邏輯錯誤。 此巨集可在發生未預期的情況時,用來停止程式執行,方法是實作 expression 引數,僅在程式運作異常時評估為 false 。 您可以定義巨集 NDEBUG,在編譯時期關閉判斷提示檢查。 您可以使用命令列選項來關閉 assert 巨集,而不需修改原始程序檔 /DNDEBUG 。 您可以在assert包含 之前<assert.h>使用 #define NDEBUG 指示詞,關閉原始程式碼中的巨集。

assert評估為 false (0) 和呼叫abort以停止程式執行時expression,巨集會列印診斷訊息。 如果 expressiontrue (非零),則不會採取任何動作。 診斷訊息包含失敗的運算式,以及判斷提示失敗之原始程式檔的名稱及其中的行號。

診斷訊息會以寬字元列印wchar_t。 因此,即使表達式中有 Unicode 字元,它仍會如預期般運作。

診斷訊息的目的地取決於呼叫常式的應用程式類型。 主控台應用程式會透過 stderr接收訊息。 在以 Windows 為基礎的應用程式中, assert 呼叫 Windows MessageBox 函式來建立消息框,以顯示包含三個按鈕的訊息: 中止重試忽略。 如果用戶選擇 中止,程式會立即中止。 如果使用者選擇 [ 重試],則會呼叫調試程式,而且如果已啟用 Just-In-Time (JIT) 偵錯,使用者可以偵錯程式。 如果使用者選擇 [忽略],程式將會繼續正常執行。 發生錯誤條件時按兩下 [ 忽略 ] 可能會導致未定義的行為,因為不符合呼叫程式代碼的前置條件。

若要覆寫默認輸出行為,不論應用程式類型為何,請呼叫 _set_error_mode 以在 output-to-stderr 和 display-dialog-box 行為之間進行選取。

在顯示其訊息之後 assert ,它會呼叫 abort,其會顯示對話方塊,其中包含 [中止]、 [重試] 和 [忽略 ] 按鈕。 abort 結束程式,因此 [重試 ] 和 [忽略 ] 按鈕不會在呼叫之後 assert 繼續執行程式。 如果 assert 顯示對話框, abort 則不會顯示對話方塊。 唯一顯示對話框的時間 abortassert 將其輸出傳送至 stderr。

由於上述行為,在偵錯模式中呼叫之後,一律會顯示 assert 對話框。 下表會擷取每個按鈕的行為。

錯誤模式 輸出至 stderr (主控台/_OUT_TO_STDERR 顯示對話框 (Windows/_OUT_TO_MSGBOX
Abort 使用結束代碼 3 立即結束 使用結束代碼 3 立即結束
Retry 在期間中斷調試程式 abort 在期間中斷調試程式 assert
Ignore 完成結束 abort 繼續程式, assert 好像沒有引發 (可能會導致未定義的行為,因為不符合呼叫程式代碼的先決條件)

如需CRT偵錯的詳細資訊,請參閱 CRT偵錯技術

_assert_wassert 函式是內部 CRT 函式。 這些函式可協助減少物件檔案中用以支援判斷提示所需的程式碼。 不建議您直接呼叫這些函式。

assert 定義時,C 執行時間連結庫 NDEBUG 的版本和偵錯版本都會啟用巨集。 定義時 NDEBUG ,可以使用巨集,但不會評估其自變數,而且沒有作用。 啟用時, assert 巨集會呼叫 _wassert 其實作。 其他判斷提示宏 _ASSERT_ASSERTE_ASSERT_EXPR也可供使用,但只有在定義巨集時,以及當它們位於與 C 執行時間連結庫偵錯版本的程式代碼中時,才會評估傳遞給它們的 _DEBUG 表達式。

需求

常式 必要的標頭
assert, _wassert <assert.h>

頭檔無法使用函 _assert 式的簽章。 只有在未定義巨集時NDEBUG,才能使用函式的_wassert簽章。

範例

在這個程式中, analyze_string 函式使用 assert 巨集來測試幾個與字串和長度相關的條件。 如果任何一個條件失敗,程式會列印訊息,指出失敗的原因。

// 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
}

程式會產生以下輸出:

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

判斷提示失敗之後,視作業系統版本和運行時間連結庫而定,您可能會看到消息框,其中包含類似下列內容:

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

如果已安裝偵錯工具,請選擇 [偵錯] 按鈕以啟動偵錯工具,或選擇 [關閉程式] 結束。

另請參閱

錯誤處理
進程和環境控制
abort
raise
signal
_ASSERT、、_ASSERTE_ASSERT_EXPR
_DEBUG