Namespaces
Variants

assert

From cppreference.net
< c ‎ | error
定义于头文件 <assert.h>
#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/

#endif
(C23前)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*implementation defined*/

#endif
(C23起)

assert 的定义取决于另一个宏 NDEBUG ,该宏并非由标准库定义。

如果在源代码中包含 <assert.h> 的位置将 NDEBUG 定义为宏名称,则 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 CRT 中 assert 的实现不符合 C99 及后续修订版标准,因为其底层函数 ( _wassert ) 既不接收 __func__ 也不接收等效替代参数。

尽管 C23 中对 assert 的修改( N2829 )并非正式缺陷报告,但 C 标准委员会 建议 各实现版本将此项修改向后移植至旧模式。

示例

#include <stdio.h>
// 取消注释以禁用 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;
}

可能的输出:

--- 未定义 NDEBUG 时的输出:---
a.out: main.cpp:10: main: Assertion `x >= 0.0' failed.
--- 定义 NDEBUG 时的输出:---
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宏(页码:169)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 4.2.1.1 assert 宏

参阅

导致程序异常终止(不进行清理操作)
(函数)
C++ 文档 关于 assert