assert
|
定义于头文件
<assert.h>
|
||
|
#ifdef NDEBUG
#define assert(condition) ((void)0)
|
(C23前) | |
|
#ifdef NDEBUG
#define assert(...) ((void)0)
|
(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 标准委员会
建议
各实现版本将此项修改向后移植至旧模式。
示例
可能的输出:
--- 未定义 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
|
|