程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c標准函數庫--->assert.h

c標准函數庫--->assert.h

編輯:關於C語言

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 
已放棄 
************************************************************************************************** 
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved