boost診斷工具BOOST_ASSERT、BOOST_VERIFY、BOOST_STATIC_ASSERT
阿新 • • 發佈:2017-07-06
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可以出現在程序的任何位置:命名空間中、類中、函數中.
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