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) {
}