發信人: Wyvern (你猜), 信區: Program 標 題: 先來灌第一個程式好了...(_assert.h, _assert.c) 發信站: 杏花村 (Mon Feb 26 14:38:00 1996) /*--- _assert.h -------------------------------------------------------------*\ | 這是一個用來除錯的維護程式, 當沒有 #define NDEBUG 時, 使用它可以用來檢查 | | 並警告程式某個階段的某些數值發生錯誤, 以避免程式的邏輯錯誤或其它程式的誤 | | 用... | | | | Assert 用來檢查一個 expression 是否不成立, 沒有傳回值 | | pvAssert 用來檢查是否誤用一個 null pointer, 會傳回該 pointer | | AssertR 同 Assert, 但是不管有沒有 #define NDEBUG 都有效 | | pvAssertR 也一樣隨時有效 | | | | 當錯誤被攔截到時, 程式會 abort(), 在 UNIX 下會產生 core dump, 如果在邊譯 | | 時有加上除錯碼選項 -g 等等, 則會產生可 debug 的 core。另外也會顯示發生錯 | | 誤的檔案與行號。 | \*---------------------------------------------------------------------------*/ #if !defined( NDEBUG ) void *_pvAssert( void *pv, char *, unsigned ); void _Assert( int ex, char *, unsigned ); #define pvAssert( p ) _pvAssert( p, __FILE__, __LINE__ ) #define Assert( ex ) _Assert( ex, __FILE__, __LINE__ ) #else #define pvAssert( p ) p #define Assert( ex ) #endif #define pvAssertR( p ) _pvAssert( p, __FILE__, __LINE__ ) #define AssertR( ex ) _Assert( ex, __FILE__, __LINE__ ) /*--- _assert.c -------------------------------------------------------------*/ void *_pvAssert( void *pv, char *strFile, unsigned uLine ) { if ( pv ) return pv; fflush( stdout ); fprintf( stderr, "\npvAssert: fail in %s, line %u.\n", strFile, uLine ); fflush( stderr ); abort(); } void _Assert( int ex, char *strFile, unsigned uLine ) { if ( !ex ) { fflush( stdout ); fprintf( stderr, "\nAssert: fail in %s, line %u.\n", strFile, uLine ); fflush( stderr ); abort(); } }