<div><br><br></div> <div>문제는 C++에서 bool을 쓰던 사람들이 C 코드를 만질 때 일어납니다.</div> <div><br></div> <div>32비트 시스템을 상정하면,</div> <div><br></div> <div>int는 보통 32비트 즉 4바이트의 메모리를 차지합니다.</div> <div>char는 8비트 즉 1바이트의 메모리를 차지합니다.</div> <div><span style="font-size:9pt;line-height:1.5;">bool도 8비트 즉 1바이트의 메모리를 차지합니다.</span></div> <div><br></div> <div>C에서는 bool이 없습니다. </div> <div><br></div> <div>스탠다드 라이브러리를 써보신 분들은 아시겠지만 리턴값은 대부분 size_t(unsigned int)입니다.</div> <div><a target="_blank" href="http://pubs.opengroup.org/onlinepubs/007904875/basedefs/stdbool.h.html" target="_blank">http://pubs.opengroup.org/onlinepubs/007904875/basedefs/stdbool.h.html</a></div> <div>C99 스탠다드인 stdbool.h에선 _Bool에 대한 마스크로 씁니다. 이는 unsigned int로 치환됩니다.</div> <div><br></div> <div>사실 여기까지는 괜찮습니다. 이것도 굳이 필요 없는데 C++의 영향으로 많이들 후술할 매크로를 쓰니 어쩔 수 없이 우겨넣은 겁니다.</div> <div><br></div> <div><br></div> <div>제가 문제를 제기하는 bool을 쓰는 사람들은 이런 매크로를 씁니다.</div> <div><br></div><pre style="overflow:auto;padding:2px;max-width:600px;line-height:normal;background-color:#f6f6ef;"><code> typedef char bool;</code></pre> <div><br></div> <div><font face="monospace">그리고 이런 식으로 사용합니다.</font></div> <div><pre style="overflow:auto;padding:2px;max-width:600px;line-height:normal;background-color:#f6f6ef;"><code> bool foo = strfind(strarg, strcontext);</code></pre> <div><code><br></code></div><span style="font-family:Verdana;line-height:normal;background-color:#f6f6ef;"></span></div> <div><b>만일</b> strfind가 포인터를 리턴하고, 찾은 포인터의 제일 뒷 8 비트가 0이라면 문제가 됩니다.</div> <div>가령 0xffae4200같은 포인터가 나온다면, 8비트로 변환했을 때는 0x00이 나옵니다.</div> <div><br></div> <div>재미있는 건 이런 매크로를 쓰는 사람들은 십중팔구는 이런 매크로와 같이 쓰거든요.<br><br><div><pre style="overflow:auto;padding:2px;max-width:600px;line-height:normal;background-color:#f6f6ef;"><code> #define true 1 #define false 0 .... if (foo == true) .... /* do_something */</code></pre></div><br>C에 bool을 넣는 건, 주지하다시피 C++에서 bool을 쓰기 시작함으로서입니다.</div> <div>많은 사람들이 참/거짓을 쓸 때 4바이트(2바이트)짜리 int를 쓰다가 공간을 아낌과 동시에 쓰임새도 뚜렷한(BOOLean) 타입을 선호하게 됐습니다.</div> <div>그러다 보니 C에서도 bool을 쓰려는 시도가 잦아졌고, 결국 stdbool.h이 탄생했던 겁니다.</div> <div><br></div> <div>문제는 이 컨벤션이 너무 늦게 나왔습니다.</div> <div>엔간한 라이브러리는 죄다 C89 스탠다드일 때 쓰여졌습니다.</div> <div><span style="font-size:9pt;line-height:1.5;">참/그름을 밝히는 라이브러리 함수나 포인터를 리턴하는 함수들을 찾아보세요.</span></div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><span style="font-size:9pt;line-height:1.5;">전부</span></div> <div><pre style="overflow:auto;padding:2px;max-width:600px;line-height:normal;background-color:#f6f6ef;"><code> #define NULL 0</code></pre></div> <div>이나</div> <div><pre style="overflow:auto;padding:2px;max-width:600px;line-height:normal;background-color:#f6f6ef;"><code> #define NULL ((void*)0)</code></pre></div> <div><font face="monospace">을 씁니다.</font></div> <div><font face="monospace"><br></font></div> <div><font face="monospace">C에서 참과 그름을 밝히는 컨벤션은 거의 없습니다.</font></div> <div><span style="font-family:monospace;font-size:9pt;line-height:1.5;">그르거나(NULL) 그르지 않은(포인터가 있는) 걸 분간해낼 뿐입니다.</span></div> <div><font face="monospace">그렇지 않은 건 죄다 99년 이후에 쓰여진 코드가 많습니다.</font></div> <div><br></div> <div><br></div> <div>물론, C++에선 bool을 쓰는 게 옳습니다.</div> <div>하지만 C에선 역사적 이유도 있을 뿐더러, 생각 않고 쓰다간 치명적인 버그를 낼 위험성이 있습니다.<br><br><div>그냥 쓰지 마세요.</div><br><br><b>물론</b> 임베디드 등 메모리 비트 하나하나까지 다 써야 하는 경우가 있긴 있습니다.<br><b>비트 필드나 유니온이 바로 그럴 때 쓰이는 겁니다.</b><br>굳이 쓰고 싶으시면 char가 아닌 int,<br>혹은 uint32, 가장 권장되는 방법은 size_t가 되겠습니다.<br></div> <div><br></div>뭐 string 오퍼레이션에 쓰는 경우라면 unitptr_t을 써도 되긴 합니다만...<br><br>여하튼 BOOLEAN의 뜻은 애초에 TRUE와 FALSE로 나뉘는 이분법입니다.<br>C에선 FALSE와 NOT FALSE로 나뉘는 이분법입니다.<br><br>BOOLEAN의 정의가 부합하지 않아요. 학구적으로도 이건 아닙니다.<br><br><br><div><br>(전에 썼던 글 수정 조금 해서 C&P해왔습니다.)<br></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.