名稱空間
變體
操作

assert

來自 cppreference.com
< c‎ | 錯誤
定義於標頭檔案 <assert.h>
#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*實現定義*/

#endif
(直至 C23)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*實現定義*/

#endif
(自 C23 起)

assert 的定義取決於另一個宏 NDEBUG,它並非由標準庫定義。

如果 NDEBUG 在原始碼中包含 <assert.h> 的位置被定義為一個宏名稱,則 assert 不執行任何操作。

如果 NDEBUG 未定義,則 assert 檢查 其引數(C23 前)__VA_ARGS__ 合成的表示式(C23 起)(其必須是標量型別,否則行為未定義)是否與零相等。如果相等,assert 會在標準錯誤輸出上輸出實現定義的診斷資訊,並呼叫 abort()。診斷資訊必須包含 expression 的文字,以及 預定義變數 __func__ 的值和(C99 起)預定義宏 __FILE____LINE__ 的值。

目錄

[編輯] 引數

條件 - 標量型別表示式

[編輯] 返回值

(無)

[編輯] 註解

沒有標準化的介面可以為 assert 錯誤新增額外訊息。一種可移植的方法是使用逗號運算子,或使用 && 配合字串字面量。

assert(("There are five lights", 2 + 2 == 5));
assert(2 + 2 == 5 && "There are five lights");

Microsoft CRTassert 的實現不符合 C99 及更高版本,因為其底層函式(_wassert)既不接受 __func__ 也不接受等效的替代。

儘管 C23 中 assert 的變更 (N2829) 並非正式的缺陷報告,C 委員會建議實現將此變更回溯到舊模式。

[編輯] 示例

#include <stdio.h>
// uncomment to disable assert()
// #define NDEBUG
#include <assert.h>
#include <math.h>
 
#define TEST(...) __VA_ARGS__
 
int main(void)
{
    double x = -1.0;
    assert(x >= 0.0);
    printf("sqrt(x) = %f\n", sqrt(x));
 
    assert(TEST(x >= 0.0));
 
    return 0;
}

可能的輸出

--- Output with NDEBUG not defined: ---
a.out: main.cpp:10: main: Assertion `x >= 0.0' failed.
 
--- Output with NDEBUG defined: ---
sqrt(x) = -nan

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.2.2.1 assert 宏 (p: 196)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.2.1.1 assert 宏 (p: 135)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.2.1.1 assert 宏 (p: 186-187)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.2.1.1 assert 宏 (p: 169)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.2.1.1 assert 宏

[編輯] 參閱

導致程式異常終止(不進行清理)
(函式) [編輯]
C++ 文件 關於 assert