void assert(scalar expression);
assert(表示式) 是個標準的 macro,用來方便程式除錯。當表示式結果為 0 (邏輯判斷為假) 時,會印包含檔名、行數、函數名及表示式的訊息到 stderr,然後呼叫 abort() 結束程式。如果在 <assert.h> 之前有定義 NDEBUG 的話,就會關閉 assert() 功能,整個 assert() 會省略掉,不會產生任何程式碼。所以 assert() 不能含有有作用的程式。
簡略的 assert.h 如下:
#ifdef NDEBUG而 __assert() 函數如下:
#define assert(expr) ((void) (0))
#else /* Not NDEBUG. */
#define assert(expr) ((void) ((expr) ? 0 : \
(__assert (__STRING(expr), __FILE__, __LINE__, __func__), 0)))
#endif /* NDEBUG. */
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
沒有留言:
張貼留言