C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[838] BOOL 에서 bool 로 변환 팁.(수정)
김태선 [cppbuilder] 8619 읽음    2009-01-07 19:01
빌더나 VC나 BOOL 형은 다음과 같이 선언되어 있습니다.
typedef int                 BOOL;

BOOL 형은 C를 위한 boolean 참거짓형 데이타 형이지만 그 본질은 int 형일 뿐이죠.
상수값 TRUE = 1, FALSE = 0 일 뿐이고요.
Win API는 참거짓형에 대해 전부 BOOL 형을 값으로 리턴하고,
수 많은 프로그래머들은 MFC 등에서도 이 관습을 따라 수 많은 함수가 BOOL 로 되어 있으므로
습관적으로 자신의 프로그램에서도 BOOL 형을 사용해 참 거짓을 판단합니다.
하지만 C++에서는 bool 형이라는 정확한 논리형이 존재하고 이를 쓰는게 더 바람직합니다.
그래서 VCL에서는 win api를 한번 래핑하게 되면 bool 형으로 바꾸어 놓는 경우가 많습니다.

왜냐하면 BOOL형은 단순 int 형이기 때문에
0 이 아닌 아무 정수 값이나 가질 소지가 있고 이는 논리적으로 참이지만
BOOL 값 = 어떤함수();
if (값 == TRUE) 라는 비교에는 걸리지 않는 현상이 생기기 때문입니다.
이런 현상을 방지하기 위해 위 비교를
if (값 != FALSE) 라고 바꾸는 것이 더 바람직하다고 프로그래머에게 권고 되는 것입니다.

하지만 이것만으로는 그다지 깔끔하지 못한 면이 있으며,
if (값 != FALSE) 표현 역시 C++ 언어로 봐서는 그다지 마음에 드는 표현이 아닙니다.
C++이라면 if (값 == true) 라고 쓰는게 더 직관적이죠.

실제 프로그래밍에서 BOOL형을 정확하게 bool 형으로 바꾸어 쓰고 싶은 때는

BOOL 어떤함수();
bool 진짜값 = 0 != 어떤함수();

과 같이 처리하면 정확하게 논리 값을 설정할 수 있습니다.
본래는 bool 진짜값 = FALSE != 어떤함수(); 가 맞는데, 타이핑을 간결하게 0 으로 했습니다.

빌더의 경우는 이런 너무나 분명한 논리에 대해 굳이 위 같이 하지 않고
그냥
bool 진짜값 = 어떤함수();
식으로 처리해도 아무런 문제가 없습니다.

그러나 VC 경우는 분명히 다른 형으로 변환이라 경고 메시지를 내 보냅니다.
bool 진짜값 = (bool)어떤함수();
같은 캐스팅을 하더라도 경고 메시지를 내 보냅니다.
이 메시지가 귀잖기 때문에 위에 설명한 변환 팁을 쓸수 있는 것입니다.
이는 컴파일러의 논리적으로는 캐스팅이 어려운 완전히 이질적인 변수형이기 때문인데,
그러나 빌더처럼 그냥 직관적인 변환을 허용해도 아무런 문제가 없어 보입니다.


아주 간단한 내용이고 별로 중요한 내용도 아닌데, 설명하자니 조금 길어졌군요.
그러고 보니 이건 빌더에 필요한게 아니라  VC에 필요한 건데, 두 개발툴을 왔다 갔다 하다 보니 조금 헷갈렸군요.
권창구.태원아빠 [shiftcap]   2009-03-05 22:07 X
VC++ 에서는
bool realVal = func() & 1;

이렇게 하시면 됩니다. ^^;
김태선 [cppbuilder]   2009-03-24 01:55 X
이 팁의 내용은  BOOL 형 함수가 반드시 TRUE == 1 이 아닌 본질적으로 TRUE != 0 라는 점을 말한 것이고
이를 안전하게 처리하려면
bool 진짜값 = 0 != 어떤함수();
식으로 해야 한다는 뜻입니다.
빌더에서는 그냥 자동 처리되니 이렇게 안해도 되는데 VC는 위험성이 있다는 것이죠.

bool realVal = func() & 1;
는 거의 대부분 문제가 되지 않는 방법인 것은 분명합니다.
그러나 func() 가 2와 같은 LSB == 0인 값을 리턴하게 되면 엉뚱하게 realVal 은 false 를 가지게 됩니다.

+ -

관련 글 리스트
838 BOOL 에서 bool 로 변환 팁.(수정) 김태선 8619 2009/01/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.