C++ 如何编写自定义断言?

C++ 如何编写自定义断言?,c++,c++11,visual-c++,mfc,assert,C++,C++11,Visual C++,Mfc,Assert,我们需要一个应用程序,在发布版本中,我们需要assert,我们希望开发类似XXX_assert的东西,但问题是MFC assert可以将任何布尔表达式作为参数并对此进行计算,但如果我们编写自定义assert(例如MY_assert),那么如何实现自定义assert将对任何布尔表达式进行计算 #include<afxwin.h> #include <stdlib.h> void abort() { AfxMessageBox(_T("Test")); } #defi

我们需要一个应用程序,在发布版本中,我们需要assert,我们希望开发类似XXX_assert的东西,但问题是MFC assert可以将任何布尔表达式作为参数并对此进行计算,但如果我们编写自定义assert(例如MY_assert),那么如何实现自定义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;
#包括
#包括
无效中止()
{
AfxMessageBox(_T(“测试”));
}
#定义MY_ASSERT(BoolCondition)do{if(!(BoolCondition)){abort();}}while(0)
类CAge:公共CObject
{
公众:
内部管理;
笼子(国际年龄)
{
m__;nAge=年龄;
}
};
类MyFrame:public CFrameWnd
{
公众:
MyFrame()
{
创建(0,_T(“Hello”);
}
void OnPaint()
{
CPaintDC d(本);
cbr;
r、 CreateSolidBrush(RGB(25200152));
d、 选择对象(&r);
d、 矩形(100100250);
r、 DeleteObject();
框架*第页;//=新框架(21);
MY_断言(第页);
}
声明消息映射()
};
开始消息映射(MyFrame,CFrameWnd)
关于油漆
结束消息映射()
MyApp类:公共CWinApp
{
int InitInstance()
{
MyFrame*p=新的MyFrame();
p->ShowWindow(3);
m_pMainWnd=p;
返回1;
}
};
MyApp a;

straighforward方法应该适用于任何布尔表达式:

#include <stdlib.h>
#define MY_ASSERT(BoolCondition) do { if (!(BoolCondition)) { abort(); } } while (0)
#包括
#定义MY_ASSERT(BoolCondition)do{if(!(BoolCondition)){abort();}}while(0)

straighforward方法应该适用于任何布尔表达式:

#include <stdlib.h>
#define MY_ASSERT(BoolCondition) do { if (!(BoolCondition)) { abort(); } } while (0)
#包括
#定义MY_ASSERT(BoolCondition)do{if(!(BoolCondition)){abort();}}while(0)

在MFC assert中,参数可以是类似int或类的object的任何东西,但在MY_assert中,参数将是哪个。如果您能给我举个例子,那就太好了。@MehulDonga这个宏可以与任何
int
一起使用,并且可以与任何具有任何类型的到
bool
的隐式转换的类一起使用。我无法想象MFC断言可以与任何未准备好测试的类一起工作?@ChristianRau这是宏的标准最佳实践,因此您可以在任何上下文中使用它们,例如在
if
中。要了解为什么有必要,请将断言放在
if
中,并给
if
一个
else
@MehulDonga查看您的代码宏可能工作得非常好。只是在释放模式中,指针通常不会初始化为零,相反,单元化指针只包含垃圾(即指向随机内存位置)。因此,在
页面
的声明之后立即检查
我的断言(页面)
(没有任何初始化),很可能会导致
为true
。为什么不用
MY_ASSERT(false)
?@MehulDonga不,在发布模式下不是。这就是我在上述评论中所说的。在realease模式下,此指针不是
0
(这是导致断言错误的唯一原因),或者更确切地说,如果未将其设置为
0
,则它可能是,也可能不是。这与特定的断言实现无关(也不适用于MFC),但与统一化变量未初始化这一事实有关。因此,替换
CAge*页面带有
CAge*pAge=0int
一起使用,并且可以与任何具有任何类型的到
bool
的隐式转换的类一起使用。我无法想象MFC断言可以与任何未准备好测试的类一起工作?@ChristianRau这是宏的标准最佳实践,因此您可以在任何上下文中使用它们,例如在
if
中。要了解为什么有必要,请将断言放在
if
中,并给
if
一个
else
@MehulDonga查看您的代码宏可能工作得非常好。只是在释放模式中,指针通常不会初始化为零,相反,单元化指针只包含垃圾(即指向随机内存位置)。因此,在
页面
的声明之后立即检查
我的断言(页面)
(没有任何初始化),很可能会导致
为true
。为什么不用
MY_ASSERT(false)
?@MehulDonga不,在发布模式下不是。这就是我在上述评论中所说的。在realease模式下,此指针不是
0
(这是导致断言错误的唯一原因),或者更确切地说,如果未将其设置为
0
,则它可能是,也可能不是。这与特定的断言实现无关(也不适用于MFC),但与统一化变量未初始化这一事实有关。因此,替换
CAge*页面带有
CAge*pAge=0然后看看神奇的发生了什么。