assert
来自 cppreference.cn
定义于头文件 <cassert> |
||
禁用断言 |
||
(1) | ||
#define assert(condition) ((void)0) |
(直到 C++26) | |
#define assert(...) ((void)0) |
(自 C++26 起) | |
启用断言 |
||
(2) | ||
#define assert(condition) /* unspecified */ |
(直到 C++26) | |
#define assert(...) /* unspecified */ |
(自 C++26 起) | |
宏 assert
的定义取决于另一个宏 NDEBUG,标准库未定义该宏。
2) 否则,断言被启用
|
(直到 C++26) |
|
(自 C++26 起) |
诊断信息具有实现定义的格式,但始终包括以下信息
|
(直到 C++26) |
|
(自 C++26 起) |
表达式 assert(E) 保证是常量子表达式,如果
|
(自 C++11 起) |
内容 |
[编辑] 参数
condition | - | 标量类型的表达式 |
[编辑] 注解
由于 assert(std::is_same_v<int, int>); // error: assert does not take two arguments assert((std::is_same_v<int, int>)); // OK: one argument static_assert(std::is_same_v<int, int>); // OK: not a macro std::complex<double> c; assert(c == std::complex<double>{0, 0}); // error assert((c == std::complex<double>{0, 0})); // OK |
(直到 C++26) |
没有标准化的接口来向 assert
错误添加额外消息。包含额外消息的可移植方法是使用逗号运算符 (如果它没有被重载),或者使用 &&
和字符串字面量
assert(("There are five lights", 2 + 2 == 5)); assert(2 + 2 == 5 && "There are five lights");
Microsoft CRT 中 assert
的实现不符合 C++11 及更高版本,因为其底层函数 (_wassert
) 既不接受 __func__ 也不接受等效的替代。
自 C++20 起,诊断消息所需的值也可以从 std::source_location::current() 获得。
即使 C23/C++26 中 assert
的更改并非正式的缺陷报告,C 委员会建议 实现将此更改向后移植到旧模式。
[编辑] 示例
运行此代码
#include <iostream> // uncomment to disable assert() // #define NDEBUG #include <cassert> // Use (void) to silence unused warnings. #define assertm(exp, msg) assert((void(msg), exp)) int main() { assert(2 + 2 == 4); std::cout << "Checkpoint #1\n"; assert((void("void helps to avoid 'unused value' warning"), 2 * 2 == 4)); std::cout << "Checkpoint #2\n"; assert((010 + 010 == 16) && "Yet another way to add an assert message"); std::cout << "Checkpoint #3\n"; assertm((2 + 2) % 3 == 1, "Success"); std::cout << "Checkpoint #4\n"; assertm(2 + 2 == 5, "Failed"); // assertion fails std::cout << "Execution continues past the last assert\n"; // No output }
可能的输出
Checkpoint #1 Checkpoint #2 Checkpoint #3 Checkpoint #4 main.cpp:23: int main(): Assertion `((void)"Failed", 2 + 2 == 5)' failed. Aborted
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
LWG 2234 | C++11 | assert 无法在常量表达式中使用 |
可以使用 |
[编辑] 参见
contract_assert 语句 (C++26) |
验证执行期间的内部条件 |
static_assert 声明 (C++11) |
执行编译时断言检查 |
导致程序异常终止(不清理) (函数) | |
C 文档 关于 assert
|