CV_Assert和assert的区别

#include 
#include 
#include 
#include "opencv2/highgui.hpp"
#include "opencv2/core/core.hpp"

int main()
{
    try {
        assert(1>2);
//        CV_Assert(1>2);
    } catch (Exception& e) {
        std::cout << e.what() << std::endl;
    }
}

assert.h中的assert 的作用是计算表达式 expression ,如果其值为假(即为 0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。注意:这里会调用abort直接终止程序。

而CV_Assert是计算表达式 expression ,如果其值为假(即为 0),那么它先向 stderr 打印一条出错信息,然后抛出异常。注意:抛出异常。

这就是两者的区别,如果使用CV_Assert,我们可以通过捕获异常而不是程序崩溃,而assert会直接导致程序崩溃。上面这段代码即可验证。

#define CV_Assert( expr ) if(!!(expr)) ; else cv::error( cv::Exception(CV_StsAssert, #expr, CV_Func, __FILE__, __LINE__) )

opencv源码中可以看到,CV_Assert仅为一个宏定义调用了cv::error,其中cv::error作用为打印错误信息,并抛出异常。

void error( const Exception& exc )
{
    if (customErrorCallback != 0)
        customErrorCallback(exc.code, exc.func.c_str(), exc.err.c_str(),
                            exc.file.c_str(), exc.line, customErrorCallbackData);
    else
    {
        const char* errorStr = cvErrorStr(exc.code);
        char buf[1 << 16];

        sprintf( buf, "OpenCV Error: %s (%s) in %s, file %s, line %d",
            errorStr, exc.err.c_str(), exc.func.size() > 0 ?
            exc.func.c_str() : "unknown function", exc.file.c_str(), exc.line );
        fprintf( stderr, "%s\n", buf );
        fflush( stderr );
#  ifdef __ANDROID__
        __android_log_print(ANDROID_LOG_ERROR, "cv::error()", "%s", buf);
#  endif
    }

    if(breakOnError)
    {
        static volatile int* p = 0;
        *p = 0;
    }

    throw exc;
}

 

你可能感兴趣的:(编译)