C++> static_assert静态断言与assert动态断言
1. static_assert
static_assert静态断言,是C++关键字,作用是让编译器在编译期对常量表达时进行断言。如果通过,就不报错;如果不通过,就报错
用法:
static_assert(常量表达式, 错误提示信息);
常量表达式的值为true或者false,或者可以转化为true/false。
如果断言不通过,程序编译也不会通过。
2. assert
assert动态断言,从C继承过来的宏定义,头文件assert.h。
从下面源码可以看到,assert是把表达式通过static_cast
// # if defined __cplusplus
# define assert(expr) \
(static_cast <bool> (expr) \
? void (0) \
: __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
assert不管断言是否通过,都不会影响编译。
3. static_assert与assert主要区别
- 断言通关是否影响编译
static_cast: 断言不通过编译出错,因为是编译器在编译器进行检查;
assert: 断言不通过不会影响编译,程序运行时检查;
static const int a = 0;
static_assert(a > 1, "error1"); // 无法通过编译
static_assert(a > -1, "error2"); // 可以通过编译
assert(0); // 可以通过编译, 但无法继续运行
assert(1); // 可以通过编译, 可以继续运行
- 是否影响程序运行效率
static_assert: 所包含的代码不会生成目标代码,不会影响程序性能;
assert: 会影响程序性能,常用于调试阶段,正式释放软件时通常关闭assert功能;