1. 程式人生 > >boost診斷工具BOOST_ASSERT、BOOST_VERIFY、BOOST_STATIC_ASSERT

boost診斷工具BOOST_ASSERT、BOOST_VERIFY、BOOST_STATIC_ASSERT

x11 size new 增加 long ica 工具 type ring

boost.assert提供的主要工具是BOOST_ASSERT宏,類似於C語言的assert,提供運行時的斷言,但功能有所增強;
默認情況下,BOOST_ASSERT宏等同於assert宏: # define BOOST_ASSERT(expr) assert(expr);
BOOST_ASSERT宏僅會在Debug模式下起作用,在Release模式下不會被編譯,不會影響運行效率;
BOOST_ASSERT宏是標準斷言宏assert的增強版本,使用更加靈活;
定義BOOST_DISABLE_ASSERTS宏可禁止BOOST_ASSERT作用,但assert宏不會受影響;
定義BOOST_ENABLE_ASSERT_HANDLER

宏將導致BOOST_ASSERT的行為發生改變;

BOOST_VERIFY宏是assert庫提供的另一種工具,斷言表達式一定會被求值,其余與BOOST_ASSERT行為相同。

assert與BOOST_ASSERT是運行時斷言,但有時候運行時已經很晚了,程序已經發生了無可挽回的錯誤;
static_assert庫能夠把斷言診斷的時刻由運行時提前到編譯期,增加程序的健壯性;
BOOST_STATIC_ASSERT是一個編譯期斷言,使用typedef和模板元技術實現;
BOOST_STATIC_ASSERT可以出現在程序的任何位置:命名空間中、類中、函數中.

C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
boost.assert提供的主要工具是BOOST_ASSERT宏,類似於C語言的assert,提供運行時的斷言,但功能有所增強;
默認情況下,BOOST_ASSERT宏等同於assert宏: # define BOOST_ASSERT(expr) assert(expr);
BOOST_ASSERT宏僅會在Debug模式下起作用,在Release模式下不會被編譯,不會影響運行效率;
BOOST_ASSERT宏是標準斷言宏assert的增強版本,使用更加靈活;
定義BOOST_DISABLE_ASSERTS宏可禁止BOOST_ASSERT作用,但assert宏不會受影響;
定義BOOST_ENABLE_ASSERT_HANDLER宏將導致BOOST_ASSERT的行為發生改變;

BOOST_VERIFY宏是assert庫提供的另一種工具,斷言表達式一定會被求值,其余與BOOST_ASSERT行為相同。

assert與BOOST_ASSERT是運行時斷言,但有時候運行時已經很晚了,程序已經發生了無可挽回的錯誤;
static_assert庫能夠把斷言診斷的時刻由運行時提前到編譯期,增加程序的健壯性;
BOOST_STATIC_ASSERT是一個編譯期斷言,使用typedef和模板元技術實現;
BOOST_STATIC_ASSERT可以出現在程序的任何位置:命名空間中、類中、函數中.
*/



/************************************************************************/
/* C++ stl Library */
/************************************************************************/
#include <iostream>
#include <string>

/************************************************************************/
/* C++ boost Library */
/************************************************************************/
#define BOOST_DISABLE_ASSERTS //禁用BOOST_ASSERT
#define BOOST_ENABLE_ASSERT_HANDLER //為BOOST_ASSERT添加handler
#include <boost/assert.hpp>
#include <boost/format.hpp>
#include <boost/static_assert.hpp>
#include <cassert>
using namespace std;

namespace boost
{
void assertion_failed(char const * expr, char const * function, char const * file, long line)
{
boost::format fmt(
"Assertion Failed!\nExpression: %s\nFunction: %s\nFile: %s\nLine: %ld\n\n");
fmt % expr% function% file% line;
cout << fmt;
}
}

template<typename T>
void print(T &tok)
{
for(BOOST_AUTO(pos, tok.begin()); pos != tok.end(); pos++)
{
cout <<
"[" << *pos << "]" ;
}
cout << endl;
}

double func(int x)
{
BOOST_ASSERT(x !=
0 && "divided by zero!");
return 1.0/x;
}

int main(void)
{
BOOST_ASSERT(
16 == 0x10);
//assert(16 == 0x11);
//BOOST_ASSERT(string().size() == 1);
//func(0);

int nLen = 0;
string str(
"Michael Joessy!");
BOOST_VERIFY(nLen = str.length());
cout <<
"length of str is " << nLen << endl;

BOOST_STATIC_ASSERT(
2 == sizeof(short));
//BOOST_STATIC_ASSERT(3 == sizeof(short));

cin.get();
return 0;
}

boost診斷工具BOOST_ASSERT、BOOST_VERIFY、BOOST_STATIC_ASSERT