2008. 5. 16. 19:57

C 언어에서의 bool 타입

이전글에서 C와 C++에서의 bool 타입의 동작 대해서 글을 썼습니다.


이제 C언어에서의 bool 타입의 변천사에 대해서 써볼까 합니다.

C99 이전의 C 언어에서는 bool 타입(참과 거짓을 표현하는)이 존재하지 않았습니다.

따라서 프로그래머들은 다음과 같은 방법으로 bool 타입을 사용했습니다.
typedef int bool
#define false 0
#define true  1

bool b;
b = true;


그러다가 C99에서 드디어 bool 타입이 등장하게 됩니다.
그런데 여기에서 문제가 발생하게 됩니다.
bool, true, false로 구성된 bool 타입을 C99에서 추가하려고 하니까.
기존에 위와 같은 식으로 bool 타입을 만들어서 사용하던 수많은 C 코드들에서
문제가 발생하게 된 겁니다.

그래서 C99에서는 boolean 타입으로 bool을 사용하지 못하고 _Bool을 만들었습니다.

음. 그런데 _Bool 보다는 bool이 보기에도 좋고, 타자수도 적죠.


그래서 C99에서는 stdbool.h 파일을 제공하기로 했습니다.
stdbool.h 파일에는 다음과 같이 bool 이 정의되어있습니다.
typedef _Bool bool;
#define true   (_Bool)1
#define false (_Bool)0


그럼 결론은 다음과 같습니다.
  • C99에서 드디어 C 언어에서도 bool 타입을 제공한다.
  • C99에서 제공하는 boolean 타입의 지시어는 bool이 아닌 _Bool이다.
  • 만약 C99 표준에서 제공하는 boolean 타입을 _Bool이 아닌 bool을 사용해서 사용하고 싶다면 <stdbool.h> 파일을 include해서 사용한다.
2008. 5. 16. 19:36

C, C++ 에서의 불(bool, boolean) 타입의 동작에 대해서

C, C++에서의 bool 타입에 대해서 테스트를 해봤습니다.
테스트한 툴은 각각 다음과 같습니다.
  • gcc-4.1.2, g++-4.1.2, gcc-2.95.3
  • VC6, VS2005



첫번째, bool/BOOL 타입의 사이즈(sizeof)를 테스트해봤습니다.


/* gcc-4.1.2, g++-4.1.2 */
#include <stdbool.h>
printf("sizeof bool : %d\n", sizeof( bool));    // 결과는 1

/* gcc-2.95.3 */
printf("sizeof bool : %d\n", sizeof( bool));    // 결과는 4

/* VC6, VS2005 */
printf("sizeof bool : %d\n", sizeof( bool));    // 결과는 1
printf("sizeof BOOL : %d\n", sizeof( BOOL));    // 결과는 4




두번째, int 타입을 bool 타입에 대입해보았습니다.


/* gcc-4.1.2, g++-4.1.2 */
#include <stdbool.h>
bool b;

b = 3;        // b는 1의 값을 가지게 됩니다.
b = -3;        // b는 1의 값을 가지게 됩니다.

/* 컴파일 옵션은 "-Wall -W"를 사용했습니다.
 * int에서 bool 타입으로의 암시적 타입변환에 어떠한 경고도 출력되지 않습니다. */


/* gcc-2.95.3 */
bool b;

b = 3;        // b는 3의 값을 가지게 됩니다.
b = -3;        // b는 -3의 값을 가지게 됩니다.


/* VC6, VS2005 */
/* 정수값을 bool 타입에 대입할 경우에 경고가 발생하게 됩니다. */
bool b;
b = 3;        // b는 1의 값을 가지게 됩니다.

BOOL B;
B = 3;        // B는 3의 값을 가지게 됩니다.



세번째, bool 타입을 정수(int)와 비교해 보았습니다.

/* gcc-4.1.2, g++-4.1.2 */
#include <stdbool.h>
bool b;

b = 3;

/* int와 bool 타입의 비교에 대해 어떤 경고도 없습니다. */
if( b == 3) {
    printf("b is 3\n");
} else {
    // b에 3을 대입했지만, 결과는 b는 3과 같지 않습니다.
    printf("b is not 3\n");
}

/* gcc-2.95.3 */
bool b;

b = 3;

/* int와 bool 타입의 비교에 대해 어떤 경고도 없습니다. */
if( b == 3) {
    // 결과는 b는 3과 같다고 나옵니다.
    printf("b is 3\n");
} else {
    printf("b is not 3\n");
}

/* VC6, VS2005 */
/* int와 bool 타입의 비교에 대해 경고를 발생시킵니다. */
bool b;
b = 3;
if( b != 3) {
    /* b에 3을 대입했지만, 결과는 b는 3과 같지 않습니다. */
    printf("b is not 3\n");
}

BOOL B;
B = 3;
if( B == 3) {
    /* B에 3을 대입하고, 그 값이 여전히 3입니다. */
    printf("B is 3\n");
}



bool 타입을 테스트한 결과는 다음과 같습니다.

gcc-2.95.3의 bool 타입과 VC6과 VS2005의 BOOL 타입은 다음과 같이 구현되어있을 것입니다.

typedef int bool;    // gcc-2.95.3
typedef int BOOL;    // VC6, VS2005



gcc-4.1.2와 g++-4.1.2의 bool 타입과 VC6, VS2005의 bool 타입은
실제 bool 타입으로 볼 수 있습니다.

하지만 gcc의 경우에는 다음과 같은 경우에 어떤 경고도 발생시키지 않습니다.

  • int 타입을 bool 타입에 대입
  • int 타입과 bool 타입의 비교

(혹시 gcc에서 이 경우에 경고를 출력할 수 있는 옵션이 있다면 알려주시면 감사하겠습니다.^^;)



그럼 이제 bool 타입을 어떻게 사용해야할까요?

gcc-2.95.3에서는 bool 타입을 사용하지 말아야겠습니다.
제 개인적으로는 bool 타입의 의미가 더 혼란스러워지는 것 같습니다.
실제 값이 true,false가 아닌 다른 값을 가질 수도 있고,
어떤 경고도 없으니까요

VC6, VS2005에서는 BOOL이 아닌 bool을 사용해야합니다.
BOOL은 int 타입입니다. bool 타입으로 정확하게 동작하는 것은 BOOL이 아닌
bool 입니다. 따라서 BOOL이 아닌 bool 타입을 사용해야 합니다.

bool 타입을 비교하는 경우에 참과 비교하지 말고, 거짓과 비교해야 합니다.
다음의 코드를 보죠.

BOOL B;
B = 3;
if( B == TRUE) {
    /* B는 TRUE가 아닙니다. B는 3의 값을 가지고, TRUE는 1의 값을 가집니다. */
}

위 코드를 다음과 같이 수정해보죠.
다음의 코드들은 모두 위와 같은 문제가 없습니다.
BOOL B;

B = 3;

if( B) {
}

if( !B) {
}

if( B != FALSE) {
}

if( B == FALSE) {
}