assert 를 쓰자

1.
#include <assert.h>
를 해준다.

int a = 0;
assert( a );

assert( false ) 일 경우에 언제나 프로그램은 여기서 멈춘다.
이때 창이 뜨는데
Expression: a
라고 assert 함수안의 표현식이 뜬다.

이걸 이용해서
assert(!"a is NULL");
같은 식으로 강제로 특정 문장을 띄우는 식도 가능하다.
Expression: !"a is NULL"

보통은 assert( a >= 0 ) 처럼 변수의 값을 테스트할때 사용한다.
이 경우에 a 가 자연수가 아닐경우 프로그램이 멈춘다.

2.
디파인으로 나만의 커스텀 Asert 를 만들어보자.

#define Assert(a,b) assert( a && b )
를 해준다.

그리고
int a = 0;

Assert( a != 0, "a is NULL" );
를 하면
경고창에
Expression: a != 0 && "a is NULL"
이 뜬다.

3.
이걸 좀 더 확장해보자.

#if defined( _DEBUG )
extern bool CustomAssertFunction( bool, char*, int, char* );

#define Assert( exp, description ) \
   if( CustomAssertFunction( (int)(exp), description, __LINE__, __FILE__ ) ) \
   { _asm{ int 3 } } // 디버거가 여기서 멈춘다.
#else
#define Assert( exp, description )
#endif

#if defined( _DEBUG )
   A
#else
   B
#endif
는 디버그일때만 A 가 실행되도록 하는 문법이다.
#ifdef 등과 관련한 자세한 설명은 인터넷에서 찾아보자.

\는 줄이 넘어가도 계속 이어지고 있다는 기호이다.
#define 은 한 줄안에 정의되어야 하기 때문에 긴 문장을 여러줄에 나눠 적고 싶으면 \ 를 해준다.
_asm{ int 3 } 을 해주면 보통의 assert 를 사용했을때와 달리 assert 가 사용된 곳에서 디버거가 멈춘다.

int a = 0;

Assert( a != 0, "a is NULL" );
를 해주면 함수 CustomAssertFunction 에
bool exp = false
char* description = "a is NULL"
int line = 234 (발생 라인값)
char* flie = "C:\test\assert.cpp" (발생 파일값)
값이 전해진다. 출력은 적당히 해주자.

개발자가 중단을 선택하면 CustomAssertFunction 는 TRUE를 돌려줘야하고 디버거는 멈춘다.
계속을 선택하면 FALSE를 돌려줘야하고 프로그램을 계속 실행된다.
( 필자는 mfc로 버튼을 두 개 만들어서 각각 true 와 false 를 반환하도록 했다. )

int a = 0;
Assert( a != 0, "a is NULL" );
Assert( a != 0, "a is NULL(2)" );
Assert( a != 0, "a is NULL(3)" );
로 확인해보자.

4.
"다음부터 항상 무시" 옵션을 붙여보자.
화면갱신 루틴안에 assert 가 있는경우에 유용할 것이다.

#if defined( _DEBUG )
extern bool CustomAssertFunction( bool, char*, int, char*, bool* );

static bool ignoreAlways = false; \

#define Assert( exp, description ) \
 { if( !ignoreAlways ) { \
   if( CustomAssertFunction( (int)(exp), description, __LINE__, __FILE__, &ignoreAlways ) ) \
   { _asm{ int 3 } } \
  } \
 }
#else
#define Assert( exp, description )
#endif

ignoreAlways 값이 추가되었다.
assert 가 발생했을때 이 옵션을 켜주면 ignoreAlways 값이 TRUE 가 되도록 해준다.
( 필자는 체크박스를 하나 만들고 선택시에 true 값이 들어가도록 했다. )

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 술취한아저씨 | 2009/05/14 14:37 | 알쏭달쏭 플밍언어 | 트랙백

트랙백 주소 : http://h2ostudio.egloos.com/tb/4354908
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
※ 로그인 사용자만 덧글을 남길 수 있습니다.

◀ 이전 페이지          다음 페이지 ▶