1. assert 宏
运行时断言 所在的头文件
#include< assert.h > 或 #include< cassert >
宏 assert
的定义依赖于标准库不定义的另一个宏 NDEBUG
若 NDEBUG 在包含了 <assert.h>
的源代码中的点定义为宏名,则 assert
不做任何事。
若不定义 NDEBUG ,则 assert
将其参数(必须拥有标量类型)与零比较相等。若相等,则 assert
在标准错误输出上输出实现指定的诊断信息,并调用 abort() 。诊断信息要求包含表达式的文本,还有预定义变量 func 与 (C99 起)预定义宏 FILE、 LINE 的值
assert(N>0 && "这里的N必须要大于0");
2. 静态断言 static_assert
static_assert
是 C++11 引入的一个编译时断言机制,它允许程序员在编译阶段检查某些条件是否成立。如果条件不成立,编译器会发出错误信息,从而阻止代码的编译。这在模板编程和类型安全方面尤其有用,可以帮助开发者在编译时捕捉错误
static_assert 用好了,可以帮助我们在编译的时候就能发现很多问题,下面给出几个常用的场景
- 模板编程
#include <iostream>
#include <type_traits>template <typename T>
void process(T value) {static_assert(std::is_integral<T>::value, "Template parameter T must be an integral type!");std::cout << "Processing integral value: " << value << std::endl;
}int main() {process(42); // 正常工作// process(3.14); // 编译错误:Template parameter T must be an integral type!return 0;
}
- 常量条件检查
#include <iostream>template <typename T, std::size_t N>
void checkArraySize(T(&)[N]) {static_assert(N > 10, "Array size must be greater than 10!");std::cout << "Array size is: " << N << std::endl;
}int main() {int arr[11];checkArraySize(arr); // 正常工作// int emptyArr[0]; // 编译错误:Array size must be greater than 10!// checkArraySize(emptyArr);return 0;
}
- 类型安全
#include <iostream>
#include <type_traits>int main() {std::string s1;std::string s2;const char* s3;static_assert(std::is_same<decltype(s1), decltype(s2)>::value, "must the same type"); // 编译通过static_assert(std::is_same<decltype(s1), decltype(s3)>::value, "must the same type"); // 编译不通过return 0;
}
3. 优点
assert
是一个强大的工具,用于在开发和调试阶段捕捉逻辑错误;在生产环境中,通过定义NDEBUG
可以禁用所有的断言,从而提高性能。static_assert
提供了在编译时检查条件的能力,从而避免了运行时错误;当条件不满足时,编译器提供的错误信息可以帮助开发者快速定位问题. 提高代码安全性.
4. 注意事项
assert
使用时应注意避免副作用,不要把有效的逻辑传入, 并将其与适当的错误处理机制结合使用。static_assert
只能用于编译时可求值的表达式,因此不能用于运行时条件。- 如果
static_assert
的条件为假,编译器将产生错误并停止编译,错误信息将包含你提供的字符串。
5. 总结
除了经典的 assert
在 DEBUG 下运行时检查, 强大的C++11 引入 static_assert
重要特性,用于在编译时进行条件检查。它可以帮助开发者确保类型和常量的正确性,提高代码的安全性和可维护性。通过合理使用 static_assert
,可以在编译阶段捕获潜在的错误,从而减少运行时错误的可能性。
对应的视频链接
https://www.bilibili.com/video/BV1Rh6bY1EmK/?p=2