assert
来自 cppreference.cn
定义于头文件 <assert.h> |
||
#ifdef NDEBUG #define assert(condition) ((void)0) |
(直到 C23) | |
#ifdef NDEBUG #define assert(...) ((void)0) |
(自 C23 起) | |
宏 assert
的定义取决于另一个宏 NDEBUG,它不是由标准库定义的。
如果 NDEBUG 在源代码中包含 <assert.h> 的点被定义为宏名称,则 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");
Microsoft CRT 中 assert
的实现不符合 C99 及更高版本,因为其底层函数 (_wassert
) 既不接受 __func__ 也不接受等效的替换。
即使 C23 中 assert
的更改 (N2829) 不是正式的缺陷报告,C 委员会 建议 实现将此更改向后移植到旧模式。
[编辑] 示例
运行此代码
可能的输出
--- 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 The assert macro (p: 196)
- C17 标准 (ISO/IEC 9899:2018)
- 7.2.1.1 The assert macro (p: 135)
- C11 标准 (ISO/IEC 9899:2011)
- 7.2.1.1 The assert macro (p: 186-187)
- C99 标准 (ISO/IEC 9899:1999)
- 7.2.1.1 The assert macro (p: 169)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.2.1.1 The assert macro
[编辑] 参见
导致程序异常终止 (不清理) (函数) | |
C++ 文档 关于 assert
|