게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
왜 C에서 bool을 쓰면 안 되는가?
게시물ID : programmer_5206짧은주소 복사하기
작성자 : ansi5120
추천 : 3/8
조회수 : 2726회
댓글수 : 27개
등록시간 : 2014/08/29 11:06:00


문제는 C++에서 bool을 쓰던 사람들이 C 코드를 만질 때 일어납니다.

32비트 시스템을 상정하면,

int는 보통 32비트 즉 4바이트의 메모리를 차지합니다.
char는 8비트 즉 1바이트의 메모리를 차지합니다.
bool도 8비트 즉 1바이트의 메모리를 차지합니다.

C에서는 bool이 없습니다. 

스탠다드 라이브러리를 써보신 분들은 아시겠지만 리턴값은 대부분 size_t(unsigned int)입니다.
http://pubs.opengroup.org/onlinepubs/007904875/basedefs/stdbool.h.html
C99 스탠다드인 stdbool.h에선 _Bool에 대한 마스크로 씁니다. 이는 unsigned int로 치환됩니다.

사실 여기까지는 괜찮습니다. 이것도 굳이 필요 없는데 C++의 영향으로 많이들 후술할 매크로를 쓰니 어쩔 수 없이 우겨넣은 겁니다.


제가 문제를 제기하는 bool을 쓰는 사람들은 이런 매크로를 씁니다.

    typedef char bool;

그리고 이런 식으로 사용합니다.
    bool foo = strfind(strarg, strcontext);

만일 strfind가 포인터를 리턴하고, 찾은 포인터의 제일 뒷 8 비트가 0이라면 문제가 됩니다.
가령 0xffae4200같은 포인터가 나온다면, 8비트로 변환했을 때는 0x00이 나옵니다.

재미있는 건 이런 매크로를 쓰는 사람들은 십중팔구는 이런 매크로와 같이 쓰거든요.

    #define true 1        #define false 0       ....         if (foo == true)         ....         /* do_something */

C에 bool을 넣는 건, 주지하다시피 C++에서 bool을 쓰기 시작함으로서입니다.
많은 사람들이 참/거짓을 쓸 때 4바이트(2바이트)짜리 int를 쓰다가 공간을 아낌과 동시에 쓰임새도 뚜렷한(BOOLean) 타입을 선호하게 됐습니다.
그러다 보니 C에서도 bool을 쓰려는 시도가 잦아졌고, 결국 stdbool.h이 탄생했던 겁니다.

문제는 이 컨벤션이 너무 늦게 나왔습니다.
엔간한 라이브러리는 죄다 C89 스탠다드일 때 쓰여졌습니다.
참/그름을 밝히는 라이브러리 함수나 포인터를 리턴하는 함수들을 찾아보세요.

전부
    #define NULL 0
이나
    #define NULL ((void*)0)
을 씁니다.

C에서 참과 그름을 밝히는 컨벤션은 거의 없습니다.
그르거나(NULL) 그르지 않은(포인터가 있는) 걸 분간해낼 뿐입니다.
그렇지 않은 건 죄다 99년 이후에 쓰여진 코드가 많습니다.


물론, C++에선 bool을 쓰는 게 옳습니다.
하지만 C에선 역사적 이유도 있을 뿐더러, 생각 않고 쓰다간 치명적인 버그를 낼 위험성이 있습니다.

그냥 쓰지 마세요.


물론 임베디드 등 메모리 비트 하나하나까지 다 써야 하는 경우가 있긴 있습니다.
비트 필드나 유니온이 바로 그럴 때 쓰이는 겁니다.
굳이 쓰고 싶으시면 char가 아닌 int,
혹은 uint32, 가장 권장되는 방법은 size_t가 되겠습니다.

뭐 string 오퍼레이션에 쓰는 경우라면 unitptr_t을 써도 되긴 합니다만...

여하튼 BOOLEAN의 뜻은 애초에 TRUE와 FALSE로 나뉘는 이분법입니다.
C에선 FALSE와 NOT FALSE로 나뉘는 이분법입니다.

BOOLEAN의 정의가 부합하지 않아요. 학구적으로도 이건 아닙니다.



(전에 썼던 글 수정 조금 해서 C&P해왔습니다.)
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호