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.h>
先使用 #define NDEBUG
指示詞來關閉assert
原始程式碼中的巨集。
當評估為 false
(0) 並呼叫 abort
以停止程式執行時expression
,巨集assert
會列印診斷訊息。 如果 expression
為 true
(非零),則不會採取任何動作。 診斷訊息包含失敗的運算式,以及判斷提示失敗之原始程式檔的名稱及其中的行號。
診斷訊息會以寬字元列印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
則不會顯示對話方塊。 唯一顯示對話框的時間 abort
是 assert
將其輸出傳送至 stderr。
由於上述行為,在偵錯模式中呼叫之後,一律會顯示 assert
對話框。 下表會擷取每個按鈕的行為。
錯誤模式 | 輸出至 stderr (主控台/_OUT_TO_STDERR ) |
顯示對話框 (Windows/_OUT_TO_MSGBOX ) |
---|---|---|
Abort |
使用結束代碼 3 立即結束 | 使用結束代碼 3 立即結束 |
Retry |
在期間中斷調試程式 abort |
在期間中斷調試程式 assert |
Ignore |
完成結束 abort |
繼續程式, assert 好像沒有引發 (可能會導致未定義的行為,因為不符合呼叫程式代碼的先決條件) |
如需CRT偵錯的詳細資訊,請參閱 CRT偵錯技術。
_assert
和 _wassert
函式是內部 CRT 函式。 這些函式可協助減少物件檔案中用以支援判斷提示所需的程式碼。 不建議您直接呼叫這些函式。
未定義 時NDEBUG
,巨集assert
會在 C 執行時間連結庫的版本和偵錯版本中啟用。 定義 時 NDEBUG
,巨集可以使用,但不會評估其自變數,而且沒有作用。 啟用時, assert
巨集會呼叫 _wassert
其實作。 其他判斷提示巨集 _ASSERT
、 _ASSERTE
和 _ASSERT_EXPR
也可供使用,但只有在定義巨集時 _DEBUG
,以及當它們位於與 C 執行時間連結庫偵錯版本的程式碼中時,才會評估傳遞給它們的表達式。
需求
常式 | 必要的標頭 |
---|---|
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