" assert의 비법들 "
1. assert의 기본
- assert 매크로 : 코드 상의 어떠한 가정을 철저하게 점검하기 위한 간단하면서도 부담 없는 방법
- 항상 TRUE가 되어야 하는 조건식을 넣는다. 조건이 FALSE로 평가되면 assert는 문제가 생겼음을 알리는 대화상자를 띄운다.
- 프로그램을 방어적으로 만들어 준다.
- 디버그 빌드에서는 수행하지만 릴리즈 빌드에서는 assert 매크로가 컴파일되지 않는다. 그러므로 assert 안에서 프로그램의 상태를 변화시켜서는 안된다.
#include <assert.h>
void VectorNormalize( Vec* src, Vec* dst ) {
assert( src != 0 );
assert( dst != 0 );
}
2. assert 비법_1) 더 많은 정보를 집어넣는다.
- assert의 조건식에 더 많은 정보를 집어 넣는다.
#include <assert.h>
void VectorNormalize( Vec* src, Vec* dst ) {
assert( src != 0 && "VectorNormalize::src vector pointer is NULL " );
assert( dst != 0 && "VectorNormalize::dst vector pointer is NULL " );
}
3. assert 비법_2) 좀더 많은 정보를 집어넣는다.
- 프로그램의 실행이 도달하지 말아야 할 곳에 도달하는 상황을 감지하기 위해서 assert(0)를 사용하는 경우도 있다. 항상 실패.
- 부정 연산자 사용
- assert( !"VectorNormalize:: The code should never get here" );
4. assert 비법_3) 좀더 편하게
- 두 개의 인자들을 받는데, 첫번째 것은 실제로 평가될 조건식이고 두번째 것은 디버깅 정보를 담는 문자열이다.
- #define Assert(a,b) assert( a && b )
- Assert( src != 0, "VectorNormalize::src vector pointer is NULL " );
Assert( 0, "VectorNormalize:: The code should never get here" );
5. assert 비법_4) 커스텀 assert 만들기
- assert보다 더 많은 기능을 가진 독자적인 검사 매크로를 만들 수 있다.
- 디버거 하에서 조건이 실패할 경우 소스파일 안의 assert 문이 아니라 assert.c 파일 안에서의 assert 문으로 들어가게 되는 경우 소스파일로 직접 들어가게 만들때 사용된다.
#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
6. assert 비법_5) 이것도 중요
- 커스텀 assert 매크로를 만드는 경우에는 assert 대화상자에 다음부터 항상 무시 옵션을 추가하는 것이 좋다
- 특정 assert 문에 대해서는 조건이 실패해도 대화상자를 표시하지 않고 무조건 넘어갈 수 있도록 하는 것이다.
#if defined(_DEBUG)
extern bool CustomAssertFunction( bool, char*, int, char* );
#define Assert( exp, description ) \
{ static bool ignoreAlways = false; \
if( !ignoreAlways ) { \
if( CustomAssertFunction( (int)(exp), description, _LINE_, _FILE_) ) \
{ _asm { int 3 } }
} \
}
#else
#define Assert( exp, description )
#endif
7. assert 비법_6) 초고수만 볼 것
- VectorNormalize를 호출하는 곳이 많다면 VectorNormalize 안의 assert 문은 프로그램을 디버거에 붙여서 실행하지 않는 한 큰 도움이 되지 못한다.
- assert 대화상자 안에 스택 정보를 표시하면 된다.
8. assert 비법_7) 좀 더 쉽게 복사해서 붙여 넣기
- 스택 정보를 좀 더 쉽게 보존/저장할 수 있는 방법이 필요
- 윈도우즈 환경에서의 한 가지 해결책은 클립보드를 이용하는 것
- assert 대화상자에 작은 버튼을 하나 만든 다음 그 버튼을 클릭할 때 스택 정보가 클립보드에 복사되도록 하면 누구라도 쉽게 클립보드의 내용을 버그 리포트나 전자 우편에 붙여 넣어서 프로그래머에게 보낼 수 있다.
- 임의의 문자열을 클립보드에 복사하는 윈도우즈 전용 코드
if( OpenClipboard( NULL ) )
{
HGLOBAL hMem;
char szAssert[256];
char *pMem;
sprintf( szAssert, "Put assert info here" );
hMem = GloabalAlloc( GHND | GMEM_DDESHARE, strlen( szAssert ) + 1 );
if( hMem)
{
pMem = (char*)GlobalLock(hMem);
strcpy( pMem, szAssert );
GlobalUnLock( hMem );
EmptyClipboard();
SetClipboardData( CF_TEXT, hMem );
}
CloseClipboard();
}
'프로그래머의 길 > C & C++' 카테고리의 다른 글
GetModuleFileName() 현재 실행 디렉토리 얻어오기 (0) | 2008.04.21 |
---|---|
TranslateMessage() (0) | 2008.04.15 |
지뢰찾기 (0) | 2007.06.28 |
라이프 게임 (0) | 2007.06.28 |
마방진 소스 (0) | 2007.06.28 |