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

assert函數解析

編輯:C++入門知識

一、assert是宏

明確一點:在C中,ASSERT是宏而不是函數。
assert()是一個調試程序時經常使用的宏。在程序運行時它計算括號內的表達式。

如果表達式為FALSE (0), 程序將報告錯誤,並終止執行。

如果表達式不為0,則繼續執行後面的語句。

這個宏通常用來判斷程序中是否出現了明顯非法的數據,如果出現就終止程序以免導致嚴重後果,同時反饋錯誤發生“地點”。

一、面試過程中,經常面試官要求實現assert。那麼這個宏該如何實現呢?

相關assert宏的實現代碼如下:


[cpp]   #include<iostream>  
 #include<stdio.h>  
 using  namespace std; 
 
 void  _assert(const char *p,const char *f,int n) 

     cout<<p<<endl; 
     cout<<f<<endl; 
     cout<<n<<endl; 
 } 
    方法1: 
    #define  assert(exp) \  
   { if(!exp)  printf("%s\n %s\n %d\n",__FILE__,#exp,__LINE__);} 
 
  方法2: 
     #define  assert(e)\  
     ((e) ? (void)0 : _assert(#e, __FILE__, __LINE__)) 
 
  
 void  main() 
 { 
     int *p=NULL; 
     assert(p!=NULL); 
 } 

 #include<iostream>
 #include<stdio.h>
 using  namespace std;

 void  _assert(const char *p,const char *f,int n)
{
     cout<<p<<endl;
     cout<<f<<endl;
     cout<<n<<endl;
 }
    方法1:
    #define  assert(exp) \
   { if(!exp)  printf("%s\n %s\n %d\n",__FILE__,#exp,__LINE__);}

  方法2:
     #define  assert(e)\
     ((e) ? (void)0 : _assert(#e, __FILE__, __LINE__))

 
 void  main()
 {
     int *p=NULL;
     assert(p!=NULL);
 }

 


三、關於assert使用應該注意哪些事項?

(1)在函數開始處檢驗傳入參數的合法性。示例代碼如下:


1 int resetBufferSize(int Size)
2 {
3 assert(Size >= 0);
4 assert(Size <= MAX_BUFFER_SIZE);
7 }
(2)每個assert只檢驗一個條件。

因為同時檢驗多個條件時。如果斷言失敗,無法直觀的判斷是哪個條件導致的失敗。

(3)不能使用改變環境的語句。因為assert只在DEBUG時生效,如果這麼做,會使程序在真正運行時遇到問題。


示例錯誤:

assert(i++ < 100);
分析探究:比如在執行該語句之前 i = 99,那麼 i++ 這條語句執行後 i = 100。但是,i++的值仍為99,這樣宏就失去了意義。
正確示例:

assert(i < 100) ;
i++;
(4)assert和後面的語句應空一行,以形成邏輯和視覺上的一致感。

(5)ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略掉。使用ASSERT“斷言”容易在debug時輸出程序錯誤所在。

 

 

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