문제는 C++에서 bool을 쓰던 사람들이 C 코드를 만질 때 일어납니다.
32비트 시스템을 상정하면,
int는 보통 32비트 즉 4바이트의 메모리를 차지합니다.
char는 8비트 즉 1바이트의 메모리를 차지합니다.
bool도 8비트 즉 1바이트의 메모리를 차지합니다.
C에서는 bool이 없습니다.
스탠다드 라이브러리를 써보신 분들은 아시겠지만 리턴값은 대부분 size_t(unsigned int)입니다.
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 스탠다드일 때 쓰여졌습니다.
참/그름을 밝히는 라이브러리 함수나 포인터를 리턴하는 함수들을 찾아보세요.
전부
이나
을 씁니다.
C에서 참과 그름을 밝히는 컨벤션은 거의 없습니다.
그르거나(NULL) 그르지 않은(포인터가 있는) 걸 분간해낼 뿐입니다.
그렇지 않은 건 죄다 99년 이후에 쓰여진 코드가 많습니다.
물론, C++에선 bool을 쓰는 게 옳습니다.
하지만 C에선 역사적 이유도 있을 뿐더러, 생각 않고 쓰다간 치명적인 버그를 낼 위험성이 있습니다.
그냥 쓰지 마세요.
물론 임베디드 등 메모리 비트 하나하나까지 다 써야 하는 경우가 있긴 있습니다.
비트 필드나 유니온이 바로 그럴 때 쓰이는 겁니다.굳이 쓰고 싶으시면 char가 아닌 int,
혹은 uint32, 가장 권장되는 방법은 size_t가 되겠습니다.
뭐 string 오퍼레이션에 쓰는 경우라면 unitptr_t을 써도 되긴 합니다만...
여하튼 BOOLEAN의 뜻은 애초에 TRUE와 FALSE로 나뉘는 이분법입니다.
C에선 FALSE와 NOT FALSE로 나뉘는 이분법입니다.
BOOLEAN의 정의가 부합하지 않아요. 학구적으로도 이건 아닙니다.
(전에 썼던 글 수정 조금 해서 C&P해왔습니다.)