c++11:static_assert 与assert
来源:互联网 发布:权力的游戏收视率数据 编辑:程序博客网 时间:2024/06/06 20:05
assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。assert分为动态断言和静态断言2种。
c++0x引入了static_assert关键字,用来实现编译期间的断言,叫静态断言。
语法:static_assert(常量表达式,要提示的字符串);
如果第一个参数常量表达式的值为false,会产生一条编译错误,错误位置就是该static_assert语句所在行,第二个参数就是错误提示字符串。
然后通过调用 abort 来终止程序运行。
使用static_assert,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。
static_assert可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。
编译器在遇到一个static_assert语句时,通常立刻将其第一个参数作为常量表达式进行演算,但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能。
性能方面,由于是static_assert编译期间断言,不生成目标代码,因此static_assert不会造成任何运行期性能损失。
简单例子:
static_assert(sizeof(void *)==4,"64位系统上不支持!");
该static_assert用来确保编译仅在32位的平台上进行,不支持64位的平台,该语句可以放在文件的开头处,这样可以尽早检查,以节省失败情况下的编译时间。
#include <cassert>#include <cstring>using namespace std;template <typename T, typename U> int bit_copy(T& a, U& b){ assert(sizeof(b) == sizeof(a)); //static_assert(sizeof(b) == sizeof(a), "template parameter size no equal!"); memcpy(&a,&b,sizeof(b));};int main(){ int aaa = 0x2468; double bbb; bit_copy(aaa, bbb); getchar(); return 0;}
这里使用assert运行时断言,但如果bit_copy不被调用,我们将无法触发该断言,实际上正确产生断言的时机应该在模版实例化时,即编译时期。
使用static_assert替换assert再次编译,即可获得一个错误并显示我们指定的错误信息。
注意:static_assert的断言表达式的结果必须是在编译时期可以计算的表达式,即必须是常量表达式。如果使用变量,则会导致错误。
如下:
int positive(const int n) { static_assert(n > 0, "value must > 0"); return 0;}
除了static_assert之外,c++还有assert和#error两个也是用来检查错误的。
assert是运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,也不具有强制性,也谈不上改善编译信息的可读性,既然是运行期检查,对性能当然是有影响的,所以经常在发行版本中,assert都会被关掉;
函数原型:
#include <assert.h> void assert( int expression );
assert是运行期的判断,并且会强制终止程序,一般要求只能用于debug版本中,是为了尽可能快的发现问题。assert是要从release版本中去掉。所以一般开发会重新定义assert宏。
error可看做预编译期断言,甚至都算不上断言,仅仅能在预编译时显示一个错误信息,它能做的不多,可以配合#ifdef/ifndef参与预编译的条件检查,由于它无法获得编译信息,当然就做不了更进一步分析了。
例如:
#ifndef __GNUC__ // 没有定义 __GNUC__ 宏,表示使用的不是gcc编译器#error 代码中使用了 gcc 特有的扩展,必须使用 gcc 编译器编译#endif
静态断言在编译时进行处理,不会产生任何运行时刻空间和时间上的开销,这就使得它比assert宏具有更好的效率。另外比较重要的一个特性是如果断言失败,它会产生有意义且充分的诊断信息,帮助程序员快速解决问题
- c++11:static_assert 与assert
- boost.assert库 static_assert
- assert,assert_static和static_assert区别
- c++11 static_assert
- static_assert
- c/c++ 静态断言 static_assert
- C++中#error/assert/static_assert的区别及使用
- static_assert和assert的基本区别(可能不全)
- c++11新特性--static_assert
- c++11新特性--static_assert
- [C++]NDEBUG宏与assert行为
- [C++]NDEBUG宏与assert行为
- C++ Assert
- [C-Library]assert.h - assert()
- C/C++assert 断言
- 【c/c++】assert()函数
- C语言关键字:static,const,inline,volatile与assert()等
- C语言 assert()函数
- 向量的点积,差乘,unity 四元数
- POJ
- web浏览器显示网站小图标
- IE浏览器兼容性BUG以及跨域访问
- MyEclipse如何恢复删掉的文件
- c++11:static_assert 与assert
- Cyclone IV 外接ddr2(一)
- jmeter 之SSL篇
- 21. Merge Two Sorted Lists(Java)
- ACM总结
- lintcode -- A+B问题
- 毁灭
- 求一个无序数组的中位数
- 高并发的核心技术-幂等的实现方案