C23에서 bool

발행: (2025년 12월 19일 오전 11:33 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

Introduction

원래 C에는 불리언 타입이 없었습니다. 대신 int를 사용했으며, 0은 false, 0이 아닌 값은 true로 취급되었습니다. 이것은 동작했지만, int를 불리언으로 사용하는 데는 여러 문제가 있습니다.

Problems with int

int를 불리언으로 사용할 때의 문제 중 하나는 명확성입니다. 다음 함수를 생각해 보세요:

int strbuf_reserve(strbuf_f *sbuf, size_t res_len);

이 함수가 반환하는 것은 무엇일까요? 단순한 불리언 값인가요? 실제로 예약된 바이트 수인가요? 오류 코드인가요? int가 의미하는 바를 알기 위해서는 문서(있는 경우)나 소스 코드를 읽어야 합니다.

그 결과, 많은 프로그래머가 C에서 자체적인 불리언 “타입”을 정의했습니다. 예를 들어:

#define bool   int   /* or: typedef int bool; */
#define false  0
#define true   1

또는 전부 대문자 버전을 사용하기도 했습니다. 하지만 이렇게 하면 서로 다른 라이브러리들이 약간씩 다른 방식으로 불리언 타입을 정의하게 되어 경고나 오류가 발생할 수 있습니다.

또 다른 문제는 메모리 사용량입니다. 구조체 안에서 int는 최소 4바이트(32비트 시스템 기준)를 차지하지만, 실제 불리언 값은 단 1비트만 필요합니다. 실용적으로는 최소 sizeof(char)(항상 1)만큼은 차지합니다.

_Bool in C99

C 위원회는 결국 C99에서 불리언 타입 _Bool을 추가했습니다. 기존 프로그램에서 bool을 식별자로 이미 사용하고 있을 수 있기 때문에, 기존 코드를 깨뜨리지 않도록 앞에 언더스코어를 붙였습니다.

표준은 또한 다음과 같은 매크로를 도입했습니다:

#define bool  _Bool
#define false 0
#define true  1

이 헤더를 포함하면 기존 코드를 깨뜨리지 않으면서도 관례적인 이름 bool, false, true를 사용할 수 있습니다.

Interaction with _Generic (C11)

C11에서 _Generic이 도입되었을 때, _Bool은 매끄럽게 통합되지 않았습니다:

#include <stdio.h>

void f_bool(void) { }
void f_int(void)  { }

#define F(X)                              \
    _Generic((X),                        \
        bool: f_bool,                     \
        int : f_int                       \
    )( (X) )

int main(void) {
    bool b = false;
    F(b);          // calls f_bool
    F(false);      // calls f_int
}

F(false) 호출이 f_int를 호출하는 이유는 false0을 위한 매크로이며, 0의 타입이 int이기 때문입니다.

Casting behavior

int   i1 = (int)0.5;        // = 0 (truncation)
_Bool b1 = (_Bool)0.5;      // = 1 (non‑zero → true)

int   i2 = (int)LONG_MAX;   // implementation‑defined
_Bool b2 = (_Bool)LONG_MAX; // = 1

int와 달리, 0이 아닌 값이 _Bool으로 캐스팅될 때는 암묵적으로 1(true)로 변환되므로 의미가 더 직관적이고 정의가 명확합니다.

bool in C23

C23에서 위원회는 마침내 완전한 불리언 타입 bool을 추가했습니다. 이제 falsetrue 키워드가 언어의 일부가 되어 _Generic과 관련된 _Bool의 문제를 없앴습니다.

이상적으로는 C11에서 _Generic과 함께 bool이 도입될 수 있었지만, C23에서의 추가가 최종적으로 적절하고 네이티브한 불리언 타입을 제공하게 되었습니다.

Conclusion

_Bool이 도입된 지 25년 이상, bool이 도입된 지 50년 이상이 지난 지금, C는 이제 명확하고, int보다 작으며, 언제나 정의가 명확한 적절한 불리언 타입을 갖게 되었습니다.

Back to Blog

관련 글

더 보기 »