티스토리 뷰

Programming/C++

C/C++ - assert

글그리 2016. 12. 28. 19:08

개요


assert는 버그의 발생을 빠르고 쉽게 파악하기 위해 사용하는 매크로다. 이름에서 알 수 있듯 어떤 것을 단언하고 디버깅 중 참 거짓 검사를 통해 단언한 조건문이 거짓이 되면 에러 메세지를 띄우며 프로그램을 종료한다.

assert 매크로는 릴리즈모드에서는 컴파일이 되지 않기 때문에 많이 써도 성능에 크게 영향을 주지 않는다. 현명하게 사용하면 버그없는(굉장히 적은) 프로그램을 만들 수 있겠다.






사용 방법


assert를 사용하려면 다음 헤더를 추가해 주어야 한다.


C : <assert.h>

C++ : <cassert>


assert를 사용할 때 주의해야 할 점은 단언할 조건을 작성해야 한다는 것이다. 일반적인 논리에 따르면 참 일때 동작하는 코드들이 많지만 assert는 거짓일 때 동작하기 때문에 일어나면 안되는 조건이 아니라 꼭 일어나야 하는 조건을 작성해야 한다.

int 변수 a가 0이 아니어야 하는 프로그램을 작성했다고 하면 assert를 다음과 같이 사용하면 된다.


void func(int a){
assert(a!=0);
// 0이라면 판별식이 false가 되고 프로그램을 종료한다.
}


assert 매크로에서 에러의 내용을 출력할 수 있다.


위 코드에서 a가 0이 됐을 때 에러 뿐 아니라 어떤 오류인지도 출력하면 버그를 수정하는 것이 더 쉬워질 것이다.


assert(a!=0 && "a is zero!");
// 에러 메시지와 함께 "a is zero!"가 출력된다.






마치며


assert 매크로는 디버그 모드에서만 컴파일 되며 릴리즈 모드에서는 컴파일 되지않기 때문에 매크로 안에서 변수에 값을 할당하거나 함수를 호출하는 등의 행위는 하지 말아야한다.

실용주의 프로그래머(앤드류 헌트, 데이비드 토머스) 에서는 assert 매크로를 에러 처리 용도로 사용하지 말고 절대 일어나면 안되는 것들을 검사하는 용도로 사용하라고 한다.



'Programming > C++' 카테고리의 다른 글

콜백함수 만들기 : 함수 포인터(Function Pointer)  (0) 2017.02.05
C/C++ - sscanf, sscanf_s  (0) 2017.01.23
C/C++ - 가변인자 ...  (0) 2016.11.19
namespace 활용하기  (2) 2016.10.10
동적할당한 stl::list 해제하기  (0) 2016.09.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함