API의 BOOL 리턴 값 비교 시 주의점

-- VC++ 2009. 5. 18. 12:20
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

윈도 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
posted by 어린왕자악꿍