2015年4月21日 星期二

assert()

#include <assert.h>

void assert(scalar expression);

assert(表示式) 是個標準的 macro,用來方便程式除錯。當表示式結果為 0 (邏輯判斷為假) 時,會印包含檔名、行數、函數名及表示式的訊息到 stderr,然後呼叫 abort() 結束程式。如果在 <assert.h> 之前有定義 NDEBUG 的話,就會關閉 assert() 功能,整個 assert() 會省略掉,不會產生任何程式碼。所以 assert() 不能含有有作用的程式。

簡略的 assert.h 如下:
#ifdef  NDEBUG
#define assert(expr)        ((void) (0))
#else /* Not NDEBUG.  */
#define assert(expr)       ((void) ((expr) ? 0 :                                                             \
                       (__assert (__STRING(expr), __FILE__, __LINE__, __func__), 0)))
#endif /* NDEBUG.  */
而 __assert() 函數如下:
static smallint in_assert;                      /* bss inits to 0. */

void __assert(const char *assertion, const char * filename,
              unsigned int linenumber, register const char * function)
{
        if (!in_assert) {
                in_assert = 1;

                fprintf(stderr,
                                "%s: %d: %s: Assertion `%s' failed.\n",
                                filename,
                                linenumber,
                                /* Function name isn't available with some compilers. */
                                ((function == NULL) ? "?function?" : function),
                                assertion
                                );
        }
        abort();
}

參考來源:man assert, assert.h, __assert.c

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...