assert.h是C標准函數庫中的頭文件。其中定義了assert()宏用於程序調試。
在C標准函數庫中,它是個非常特別的頭文件,你可以將它引入數次以獲得不同的效果,此效果依引入時是否以定義NDEBUG而定。
宏
assert()是一個診斷宏,用於動態辨識程序的邏輯錯誤條件。其原型是: void assert( int expression);
如果宏的參數求值結果為非零值,則不做任何操作(no action);如果是零值,用寬字符(wide characters)打印診斷消息,然後調用abort()。診斷消息包括:
源文件名字 (在stdlib.h中聲明的宏__FILE__的值)
所在的源文件的行號(在stdlib.h中聲明的宏__LINE__的值)
所在的函數名 (在stdlib.h中聲明的宏__func__的值),這是 C99新增的特性
求值結果為0的表達式
診斷信息的顯示目標依賴與被調用程序的類型。如果是控制台程序,診斷信息顯示在stderr設備;如果是基於窗口的程序,assert()產生一個Windows MessageBox來顯示診斷信息。
程序可以屏蔽掉所有的assert()而無需修改源代碼。這只需要在命令行調用C語言的編譯器時添加宏定義的命令行選項,定義DNDEBUG宏;也可以在源程序程序引入<assert.h>之前就使用#define NDEBUG來定義宏。被屏蔽的assert()甚至不對傳遞給它的參數表達式求值,因此使用assert()時其參數表達式不能有副作用(side-effects).
例程:
[cpp]
#include <stdio.h>
#include <assert.h>
int main (void)
{
FILE *fd;
fd = fopen ("/home/user/file.txt", "r");
assert (fd);
fclose (fd);
return 0;
}
例程:
[cpp]
//沒有定義NDEBUG
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int main()
{
printf("1 ok hello \n");
assert(1==4);
printf("2 ok exit \n");
return 0;
}
[cpp]
結果:
**************************************************************************************************
1 ok hello
assert_h_ex_nodebug: assert_h_ex.c:7: main: Assertion `1==4' failed.
已放棄
**************************************************************************************************
[cpp]
//定義NDEBUG
#include<stdio.h>
#include<stdlib.h>
#define NDEBUG
#include<assert.h>
int main()
{
printf("1 ok hello \n");
assert(1==4);;
printf("2 ok exit \n");
return 0;
}
[cpp]
結果:
********************************************************************************************************************************
1 ok hello
2 ok exit
********************************************************************************************************************************
[cpp]
原理:
#define assert(test) if(!(test))\
fprintf(stderr,"the failed : %s file %s ,line %i\n",#test, __FILE__,__LINE__);\
abort();
[cpp]
模擬:
#include<stdio.h>
#include<stdlib.h>
//#define NDEBUG
//#include<assert.h>
#define Assert(test) if(!(test)) fprintf(stderr,"Assertion failed: %s, file %s, line %i\n", #test, __FILE__, __LINE__);abort()
int main()
{
printf("1 ok hello \n");
Assert(1==4);
printf("2 ok exit \n");
return 0;
}
[cpp]
結果:
*************************************************************************************************
1 ok hello
Assertion failed: 1==4, file assert_h_ex.c, line 9
已放棄
**************************************************************************************************