命名空间
变体
操作

断言

来自 cppreference.com
< c‎ | error
定义在头文件 <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,它没有由标准库定义。

如果在源代码中包含 <assert.h> 的位置,NDEBUG 被定义为宏名,那么 assert 不会执行任何操作。

如果未定义 NDEBUG,则 assert 会检查其参数(直到 C23)__VA_ARGS__ 合成的表达式(从 C23 开始)(它必须具有标量类型,否则行为未定义)是否与零相等。如果相等,assert 会在标准错误输出上输出实现特定的诊断信息并调用 abort()。诊断信息要求包含 expression 的文本,以及 预定义变量 __func__ 的值以及(从 C99 开始)预定义宏 __FILE____LINE__ 的值。

内容

[编辑] 参数

condition - 标量类型的表达式

[编辑] 返回值

(无)

[编辑] 备注

没有标准化的接口来为 assert 错误添加附加消息。一种可移植的方法是使用 逗号运算符,或使用 && 以及字符串文字。

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

assertMicrosoft CRT 中的实现不符合 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++ 文档 for assert