BOOST_STATIC_ASSERT和assert的区别

来源:互联网 发布:业余网络作家收入多少 编辑:程序博客网 时间:2024/05/16 03:16

1.assert()函数的作用

assert在c/c++中是宏,而非函数。assert宏定义在头文件<assert.h>中。其原型如下:
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
assert的作用是先计算表达式_Expression,如果其值为假(即为0),那么它会打印出来assert的内容和__FILE__, __LINE__,然后执行abort()函数使kernel杀掉自己并coredump(是否生成coredump文件,取决于系统配置);否则,assert()无任何作用。宏assert()一般用于确认程序的正常操作,其中表达式构造无错时才为真值。完成调试后,不必从源代码中删除assert()语句,因为宏NDEBUG有定义时,宏assert()的定义为空。
下面是assert宏的使用例子:
#include <iostream>//#define NDEBUG#include <assert.h>using namespace std;int main(void){cout << "请输入一个非零值:" << endl;int iValue;cin >> iValue;assert(iValue);//我们的要求是输入的值不为0,如果输入的值为0,我们不希望继续运行下去,避免产生未定义的结果cout << "iValue = " << iValue << endl;return 0;}
当我们输入0时,正如我们所希望的那样,程序输出一条错误信息,并终止了程序的运行。

当我们不想使用assert进行断言时候,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用。

2.BOOST_STATIC_ASSERT

对于assert是运行时的断言,它只在运行时断言表达式的值。在编译期间出现的错误时不会提示的。如果我们需要在编译期间就需要确认某些表达式是否是我们所期望的那样,比方说结构体的字节对齐,这个是很常见的问题。
#include <iostream>#include <boost/static_assert.hpp>using namespace std;typedef struct{char m_cChar;int m_iValue;}MyTest;int main(void){BOOST_STATIC_ASSERT(sizeof(MyTest) == 5);return 0;}
上面的代码,看上去没什么问题。但编译期就已经提示错误了。
原来是在VC中结构体是有默认的4字节对齐方式的。我们修改下。



之后就可以顺利的编译通过了。