现在的位置: 首页 > 综合 > 正文

boost.assert库 static_assert

2013年05月25日 ⁄ 综合 ⁄ 共 1768字 ⁄ 字号 评论关闭
 ASSERT() 是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:
    ......
    ASSERT( n != 0);
    k = 10/ n;
    ......
    ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。

boost.assert库增强了原始的运行时assert宏,static_assert库提供了静态断

言(编译器诊断)
使用boost.assert库需要包含头文件<boost/assert.hpp>
BOOST_ASSERT宏:在debug模式下生效,release模式下不会进行编译
用法:
  禁用断言:可以有选择的关闭BOOST_ASSERT   BOOST_DISABLE_ASSERTS
 
   #define  BOOST_DISABLE_ASSERTS//禁用boost的断言,但是标准的assert

不受影响
   #include "boost/assert.hpp"
   double func(int x)
   {
      BOOST_ASSERT(x!=0 && "底数为0");//用&&输出断言描述信息(应经失

效)
     return 1.0/x;
    }
   void main()
   {
     double res=func(0);
   }
 
 
 

 断言处理函数
 使用BOOST_ENABLE_ASSERT_HANDLER宏
示例
#define  BOOST_ENABLE_ASSERT_HANDLER  //如果断言失败调用

boost::assertion_failed()
#include "boost/assert.hpp"
#include "iostream"
double func(int x)
 {
    BOOST_ASSERT(x!=0 && "底数为0");//用&&输出断言描述信息
    return 1.0/x;
 }
  namespace boost//必须重写boost命名空间里的assertion_failed函数,否

则会有链接错误
{
   void assertion_failed(char const * expr, char const * function, 

char const * file, long line)
     {
       std::cout<<"断言失败\n";
       std::cout<<"表达式:"<<expr<<std::endl;
       std::cout<<"调用函数:"<<function<<std::endl;
       std::cout<<"失败文件:"<<file<<std::endl;
       std::cout<<"文件行数:"<<line<<std::endl;
    }
}
void main()
 {
    double res=func(0);
 }
 
 
 
BOOST_VERIFY宏
它与BOOST_ASSERT有一样的行为
区别:断言的表达式一定会被求值(可以运用断言运算,或者验证函数返回值)
 
void main()
{
  int len;
   BOOST_VERIFY(len=strlen("123"));
   std::cout<<len<<std::endl;// 输出为3
 

}

assert和BOOST_ASSERT 用于运行时的断言
static_assert库把断言的诊断时刻由运行期提前到编译期,编译器检查可能发

生的错误,增强了程序的健壮性
需要包含头文件<boost/static_assert.hpp>
 
 
#include "boost/static_assert.hpp"//静态assert库
void main()
{
    int len=4;
 BOOST_STATIC_ASSERT(16==0x10);
 BOOST_STATIC_ASSERT(4==sizeof(int));
 
}
 BOOST_ASSERT(assert) assert必须是一个能够执行的语句,只能出现在函数

域里
 BOOST_STATIC_ASSERT 可以出现在程序的任何位置:名字空间域,类或者函数里

抱歉!评论已关闭.