一、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時輸出程序錯誤所在。