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 可以出现在程序的任何位置:名字空间域,类或者函数里