ASSERT什么时候用?怎么用?

ASSERT什么时候用?怎么用?

ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

    ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。


鉴于ASSERT以上红色标注的特点:
(1)它能够报告错误,终止执行。利用此特点可帮助调试,出错时立即得到反馈。
(2)release版本中被忽略。因为此特点,我们就必须注意,程序中应当有相应的处理错误的代码,不能依靠ASSERT。

good example :

ASSERT(NULL != pbData); //pbData是参数
    if (NULL == pbData)
    {
        hr = E_INVALIDARG;
        goto Error;
    }

bad example :

......
     ASSERT( n != 0);
     k = 10/ n;    //release版本中如果n=0,在这一行程序便会崩溃。
     ......

还有一种用法,就是在不正常的状态下加入ASSERT(0),强行停止。
比如,上面的例子也可以改成如下形式
    if (NULL == pbData)
    {
        ASSERT(0);
        hr = E_INVALIDARG;
        goto Error;
    }


PS:小写assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中,assert 是一种宏定义,其目的是在代码中判断所给定的条件是否为真,如果为假,则终止程序的执行。如果想要将 assert 的行为修改为抛出异常,可以使用以下两种方法: 1.使用自定义宏定义 可以使用自定义宏定义来将 assert 的行为修改为抛出异常。下面是一个示例代码: ```c++ #include <stdexcept> #include <iostream> // 将 assert 的行为改为抛出 runtime_error 异常 #define assert(expression) \ if (!(expression)) \ throw std::runtime_error("Assertion failed: " #expression); int main() { int x = 10; int y = 5; assert(x > y); std::cout << "x > y" << std::endl; return 0; } ``` 在上面的代码中,我们使用了自定义宏定义将 assert 的行为修改为抛出 runtime_error 异常。在执行 assert(x > y) 的时候,如果 x > y 不成立,将会抛出一个 runtime_error 异常,程序的执行也会随之终止。 2.使用断言包装函数 另一种将 assert 的行为修改为抛出异常的方法是使用一个断言包装函数,这个函数将会接受一个表达式作为参数,如果表达式不成立,则将会抛出一个异常。下面是一个示例代码: ```c++ #include <stdexcept> #include <iostream> void assert_impl(bool expression, const char* message) { if (!expression) { throw std::runtime_error(message); } } #define assert(expression) assert_impl(expression, "Assertion failed: " #expression) int main() { int x = 10; int y = 5; assert(x > y); std::cout << "x > y" << std::endl; return 0; } ``` 在上面的代码中,我们定义了一个断言包装函数 assert_impl,这个函数将会接受一个表达式和一个消息作为参数,如果表达式不成立,则将会抛出一个带有消息的 runtime_error 异常。然后,我们重新定义了 assert 宏,将它替换为调用 assert_impl 函数。这样,在执行 assert(x > y) 的时候,如果 x > y 不成立,将会抛出一个带有消息的 runtime_error 异常,程序的执行也会随之终止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值