반응형

디버그를 하기위해 assert 함수를 사용하는 경우가 생긴다. 아래는 C 컴파일러에서 지원하는 assert를 사용한 경우이다.

 

assert(pvTo != NULL && pvFrom != NULL);

 

만약 위 assert 함수안의 구문이 참이 아니라면 화면에 에러 메세지를 아래 같이 출력하고 종료할 것이다.

 

Assertion faild: pvTo != NULL && pvFrom != NULL

File pvMemcpy.c line 153

 

하지만 위의 표현식을 포함하는데 있어 문제점은, assert를 사용할 때마다, 조건의 본문 표현을 만들어 낸다는 점이다. 그리고 컴파일러가 문자열을 어디에 보관할 것인가? 보통 컴파일러들은 문자열을 전역 데이터 영역에 보관한다. 그러므로 assert 문자열은 즉시 그 메모리를 잠식해 버린다. 그러므로, 에러 메시지에서 표현식 문자열을 생략하여 출력하는 것이 그 타개책이 될 것이다.

 

#ifdef _DEBUG
void _ASSERT(char *, unsigned int; /* 원형(prototype) */
#define ASSERT(x) \
{ \

    if (x) \
        NULL; \
    else \
    _ASSERT(__FILE__, __LINE__); \
}

 

void _ASSERT(char *file, unsigned int line)

{
    fflush(stdout);
    fprintf(stderr, "\nAssertion failed: %s, line %u\n", file, line);
    fflush(stderr);
    abort();
}

 

assert ASSERT의 주된 차이점은, assert는 표현식(expression)으로써 코드 내에서 자유롭게 사용할 수 있는 반면, ASSERT는 구문(statement)으로써 그 용법이 제한된다는 점이다.

 

파일명, 라인번호 함께 문제가 된 값을 표현한다. 그리고 프로그램을 종료시킨다.

 

ASSERT 함수는 _DEBUG가 정의 되어 있지않으면 아무런 것도 하지 않는 함수이므로 소스를 수정하지 않고도 함수의 에러 처리를 무효화할 수 있는 무척 좋은 함수이다.

반응형

+ Recent posts