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