검색결과 리스트
-- VC++에 해당되는 글 48건
- 2009.05.18 API의 BOOL 리턴 값 비교 시 주의점
글
윈도 SDK에서 제공하는 함수들은 리턴 타입이 BOOL로 되어 있습니다.
WinDef.h
typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; |
모든 API는 타입을 위에서 나열한 몇 가지의 예처럼 재정의 해서 사용합니다. 이렇게 재정의해서 사용할 경우 여러가지 잇점을 가지게 됩니다. 다른 타입들은 그렇다 치는데, bool과 BOOL은 논란이 좀 있는 타입입니다. ( http://www.jiniya.net/tt/489 )
위에서 보듯 int를 재정의한 타입이기 때문에 일반적으로 TRUE, FALSE로 사용하게 되면 뒷통수를 맞을 수도 있습니다.
폴더가 존재하는지 여부를 판단하는 방법으로 아래 두 API가 쓰입니다.
BOOL PathFileExists(LPCTSTR pszPath); BOOL PathIsDirectory(LPCTSTR pszPath); |
먼저 PathFileExists로 오브젝트가 있는지 판단하고, TRUE일 경우 PathIsDirectory로 그것이 폴더인지 판단하는 겁니다. 그럼 아래와 같이 코드를 작성했다고 했을 때 잘 동작할까요?
TCHAR const * validFolderPath = TEXT("c:\\work"); if(TRUE == PathFileExists(validFolderPath)) { if(TRUE == PathIsDirectory(validFolderPath)) { DoSomethingWithDirectory(validFolderPath); } else { return false; } } else { return false; } |
위 코드는 정상적으로 동작하지 않습니다. PathIsDirectory에서 정상적인 디렉토리 path를 인자로넣어도 TRUE가 떨어지지 않습니다.
PathIsDirectory는 디렉토리가 존재하지 않으면 FALSE를 리턴하고, 디렉토리가 존재하면 16을 리턴합니다. TRUE는 1로 define되어 있기 때문에 두 번째 문장을 통과합니다.
이러한 BOOL 리턴타입의 API는 종종 발견할 수 있는데, 많이 접하는 API중에는 대표적으로 GetMessage가 있습니다.
BOOL GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); |
MSDN에서는 GetMessage의 셈플을 아래와 같이 안내하고 있습니다.
BOOL bRet; while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } |
GetMessage는 리턴값이 0일경우(WM_QUIT), -1일 경우(에러), 그외의 경우(성공)를 처리해 주어야 리턴값이 모두 처리된것이라 할 수 있습니다.
64비트 프로그래밍에서 모호한 비교를 막기 위해서 상수를 직접 비교하라는 아티클을 많이 접하고, if(value), if(!value)을 쓰기 보다는 확실하게 눈에 들어오게 하기 위해서 상수를 비교하는 경우가 많은데, API의 리턴값이 BOOL일 경우, 한 번더 생각을 해 볼 필요가 있습니다.
문제는 이러한 BOOL 리턴값의 경우 MSDN에 리턴값 안내가 잘못 나와 있는 경우가 많습니다. 사용하는 API는 DEBUG모드에서 트레이스 해 봐서 확실히 점검을 해봐야 견고하게 코딩하는 것이 되겠습니다.
출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8269&page=2
'-- VC++' 카테고리의 다른 글
VC++ 6.0 STL예제 (0) | 2009.06.05 |
---|---|
DHTML Method (0) | 2009.06.03 |
Debug Tutorial Part 1~7 (0) | 2009.05.15 |
익스플로러 보안설정 변경 (0) | 2009.05.14 |
windbg tutorial part 1 (0) | 2009.05.13 |
RECENT COMMENT