2012-10-11 64 views
1

我們需要一個應用程序,在發佈版本中我們需要斷言,我們想開發類似於XXX_ASSERT的東西,但問題出在MFC中,ASSERT可以將任何booleanExpression作爲參數並評估,但是如果我們編寫自定義斷言例如MY_ASSERT比如何實現自定義斷言將評估任何布爾表達式。如何編寫自定義斷言?

#include<afxwin.h> 
#include <stdlib.h> 
void abort() 
{ 
    AfxMessageBox(_T("Test")); 
} 
#define MY_ASSERT(BoolCondition) do { if (!(BoolCondition)) { abort(); } } while (0) 
class CAge:public CObject 
{ 
public: 
    int m_nAge; 
    CAge(int age) 
    { 
     m_nAge = age; 
    } 
}; 
class MyFrame:public CFrameWnd 
{ 
public: 
    MyFrame() 
    { 
     Create(0,_T("Hello")); 
    } 
    void OnPaint() 
    { 
     CPaintDC d(this); 
     CBrush r; 
     r.CreateSolidBrush(RGB(25,200,152)); 

     d.SelectObject(&r); 
     d.Rectangle(100,100,250,250); 
     r.DeleteObject(); 
     CAge *pAge;// = new CAge(21); 
     MY_ASSERT(pAge); 
    } 
    DECLARE_MESSAGE_MAP() 
}; 
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd) 
    ON_WM_PAINT() 
END_MESSAGE_MAP() 
class MyApp:public CWinApp 
{ 
    int InitInstance() 
    { 
     MyFrame *p = new MyFrame(); 
     p->ShowWindow(3); 
     m_pMainWnd = p; 
     return 1; 
    } 
}; 
MyApp a; 

回答

4

的簡單明瞭的做法應該只是罰款任何布爾表達式:

#include <stdlib.h> 
#define MY_ASSERT(BoolCondition) do { if (!(BoolCondition)) { abort(); } } while (0) 
+1

在MFC斷言,參數可以是如int或類的對象,但在MY_ASSERT該參數將是什麼。如果你提供我的例子,這將是很好的。 –

+0

這可能是一個愚蠢的問題,但爲什麼圍繞條件的1迭代循環呢? –

+1

@MehulDonga這個宏可以和任何'int'一起工作,它可以和任何一種隱式轉換爲'bool'的類一起工作。我無法想象MFC聲明與任何不準備測試的類一起工作? –