반응형

 

opencv\modules\core\include\opencv2\core\base.hpp의 342번째 줄에 있는 CV_Assert 매크로를 분석해보았다. 

 

#define CV_Assert( expr ) do { if(!!(expr)) ; else cv::error( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ ); } while(0)



2021. 1. 29 최초 작성.

2021. 1. 31 최종 작성.




우선 !!(exp)의 의미. 

 

!!를 사용하면 0이 아닌 모든 정수를 1로 바꾸어 주는 것이다. 

자세한 내용 - https://stackoverflow.com/questions/14751973/what-is-in-c

 

#include <iostream>


int main()
{
    printf("%d\n", !(111));
    printf("%d\n", !!(111));
}

 

0

1




do{ }while(0)은 do 문에 있는 코드가 한번만 실행된다. 굳이 사용한 이유를 찾지 못했다. 매크로에 if문 같은 복잡한 코드를 포함시키 위해 사용한다고 한다.

 

#include <iostream>

int main()
{
    int i = 0;

    do{
        i++;
        printf("%d\n", i);
    }while(0);
}

 

1




CV_Func, __FILE__, __LINE__ 부분은 이 매크로를 사용한  함수이름, 파일 이름, 라인수를 출력해주는 것이다. 

비슷하게 작성해보면 다음과 같다. 

 

!!(exp)의 조건이 0일 경우에만 함수이름, 파일이름, 라인수가 출력된다.

 

#include <iostream>

//#define CV_Assert( expr ) do { if(!!(expr)) ; else cv::error( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ ); } while(0)

#define print( expr ) do { if(!!(expr)) ; else printf("%s:%d %s\n", __FUNCTION__, __LINE__, __FILE__ ); } while(0)


int main()
{
    print(0);
}

 

main:11 D:\work\code\C_C++_Projects\1.cpp




반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 ~~

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts