發信人: 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();
}
}