C++ assert 与 static_assert 的区别
C++ 提供了两种机制来验证程序中的假设(断言):assert 和 static_assert。虽然它们看起来类似,但它们在不同的阶段工作,并且用途也不同。
🔍 assert — 运行时检查/断言
assert 用于在程序运行时验证条件是否成立。如果条件为假,程序会打印错误信息并中止运行。
#include <cassert>
int divide(int x, int y) {
assert(y != 0); // 如果 y 为 0,程序会中止
return x / y;
}
assert 通常只在调试模式下启用,如果定义了 NDEBUG,这些断言会被禁用。
🧱 static_assert — 编译时检查/静态断言
static_assert 在编译期间检查条件是否成立。如果条件不满足,编译器会直接报错,阻止程序编译。
static_assert(sizeof(int) == 4, "此代码假设 int 是 4 字节");
它要求条件是一个常量表达式,特别适合在模板、类型检查或平台限制中使用。
📊 对比表
| 特性 | assert |
static_assert |
|---|---|---|
| 检查时机 | 运行时 | 编译时 |
| 是否可被禁用 | 可以(通过 NDEBUG) |
不可以 |
| 是否需要常量表达式 | 不需要 | 需要 |
| 失败时表现 | 程序中止 | 编译失败 |
| 主要用途 | 调试时的逻辑检查 | 编译时的类型或平台验证 |
💡 使用建议
- 适合使用
assert的场景:- 检查运行时数据或逻辑
- 验证函数参数或程序状态
- 只在调试模式下需要检查
- 适合使用
static_assert的场景:- 验证类型或大小是否符合要求
- 确保模板参数使用正确
- 编译时需要强制保证某些条件
总结
assert 和 static_assert 都能帮助你更早地发现程序中的问题,但它们发生的时间点不同。static_assert 更适合在编译阶段做静态验证,而 assert 更适合在调试阶段检查运行时逻辑。
C/C++编程
- 理解C++中的std::transform_reduce及示例
- 使用原子 TAS 指令实现自旋锁
- C++中检测编译时与运行时: if consteval 与 std::is_constant_evaluated()
- C++ 转发引用: 完美转发的关键
- 理解 C++ 中的 dynamic_cast: 安全的向下转型与向上转型
- C与C++: restrict关键字及其在编译器优化中的作用
- C++的左值/lvalue, 右值/rvalue和右值引用/rvalue references
- C++中的assert和static_assert的区别
- C++: auto_ptr智能指针被弃用
- C++中的consteval是什么? 它与const和constexpr有何不同?
- C++ 教程: 用std::move来移动所有权
- C++中的 const和constexpr 比较
- 简易教程: C++的智能指针
- C++ 编程练习题: 如何合并两个二叉树?
- C++ 编程练习题 - 找出第三大的数
- C++ 编程练习题 - 最多连续的 1
- C++ 编程练习题 - 左子树叶节点之和 (深度优先+广度优先+递归)
- C++ 编程练习题 - 最多水容器 (递归)
- C++的异步编程: std::future, std::async 和 std::promise
- C编程练习题: 翻转整数位
- C++编程练习题: 找出字符串的所有大小小组合
- C/C++ 中的内存管理器(堆与栈)
- C++编程练习题: 对两单向链表求和
英文:C++ assert vs static_assert
本文一共 479 个汉字, 你数一下对不对.上一篇: C++: auto_ptr智能指针被弃用
下一篇: C++的左值/lvalue, 右值/rvalue和右值引用/rvalue references
扫描二维码,分享本文到微信朋友圈