基础介绍
断言(assert)功能是从C语言基础而来的一个功能,在早期的c++98版本就已经存在,直到c++11版本引入了静态断言(staic_assert)功能。
断言是一种在程序中检查条件的机制,当断言的条件为假时,程序会立即终止并提供相关信息。
断言的分类:
- 静态断言
- 运行时断言
其中静态断言与C++11版本引入,静态断言的使用方法如下所示:
// 编译时检查
static_assert(condition, message);
注意:静态断言的核心是在编译阶段生效,常用来判断常量表达式,比如在编译阶段判断平台的架构是否64位或判断大小端是否与预期一致等。例子如下所示:
// 1. 类型大小检查
static_assert(sizeof(int) == 4, "Int must be 4 bytes");
//平台检查
static_assert(sizeof(void*) == 8, "Must be 64-bit platform");
运行时断言的含义是在程序运行阶段进行判断,而非编译阶段进行判断。如果断言条件为假,则层序会立即终止,而不会抛出异常。
注意事项
- 对于运行时断言,可通过设置NDEBUG编译选项关闭运行时段断言,所以在运行时断言仅做条件判断,不做任何其他运算。请看下面的例子:
//错误做法
assert(counter++ > 0, “counter not large 0"); //assert可能不会运行,所以counter++不会进行计算,如果后代码的依赖与counter计算后的结果,则可能会发生错误。//正确做法
counter++;
assert(counter > 0, “counter not large 0");//c++17写法
assert(counter++ > 0); //第二个参数可以省略
- 静态断言无法被关闭,当静态断言条件为假时,会导致编译终端,并将错误信息输出到编译输出界面
- 运行时断言一般用于开发阶段,很多工程场景下会关闭运行时断言,而是将断言替换为异常处理。
- 在c++17版本,断言可以不输入第二个参数,即具体错误的字符串部分。