[c] bool은 네이티브 C 유형입니까?

리눅스 커널 코드가 bool을 사용한다는 것을 알았지 만 bool은 C ++ 유형이라고 생각했습니다. bool은 표준 C 확장 (예 : ISO C90) 또는 GCC 확장입니까?



답변

bool 현재 C-C99에는 있지만 C89 / 90에는 없습니다.

C99에서 기본 유형은 실제로라고 _Bool하면서, bool에 정의 된 표준 라이브러리 매크로입니다 stdbool.h(이 예상대로 결의에이 _Bool). 유형의 개체 _Bool동안 보류 0 또는 1 truefalse도에서 매크로입니다 stdbool.h.

참고 BTW,이 C 프리 프로세서가 해석하는 것을 의미하는 것이 #if true#if 0하지 않는 stdbool.h포함되어 있습니다. 한편 C ++ 전처리 기는 기본적으로 true언어 리터럴로 인식해야합니다 .


답변

C99는 내장 _Bool데이터 형식을 추가했으며 (자세한 내용은 Wikipedia 참조) 매크로 인 경우에 매크로로 #include <stdbool.h>제공 bool됩니다 _Bool.

특히 리눅스 커널에 대해 물었습니다. include / linux / types.h 에 typedef 자체가 있다고 가정하고 typedef를 _Bool제공합니다 .bool


답변

아니요, boolISO C90 에는 없습니다 .

표준 C (C99 아님)의 키워드 목록은 다음과 같습니다.

  • auto
  • break
  • case
  • char
  • const
  • continue
  • default
  • do
  • double
  • else
  • enum
  • extern
  • float
  • for
  • goto
  • if
  • int
  • long
  • register
  • return
  • short
  • signed
  • static
  • struct
  • switch
  • typedef
  • union
  • unsigned
  • void
  • volatile
  • while

다음 은 커널 및 표준에서 사용되는 C와의 다른 차이점에 대한 기사입니다 . http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html


답변

C99는 stdbool.h 에 있지만 C90에서는 typedef 또는 enum으로 정의해야합니다.

typedef int bool;
#define TRUE  1
#define FALSE 0

bool f = FALSE;
if (f) { ... }

또는

typedef enum { FALSE, TRUE } boolean;

boolean b = FALSE;
if (b) { ... }


답변

/* Many years ago, when the earth was still cooling, we used this: */

typedef enum
{
    false = ( 1 == 0 ),
    true = ( ! false )
} bool;

/* It has always worked for me. */


답변

_BoolC99의 키워드 : int또는 처럼 유형을 지정합니다 double.

6.5.2

2 _Bool 유형으로 선언 된 객체는 값 0과 1을 저장하기에 충분히 큽니다.


답변

C99은 부울을 정의 true하고 false에서 stdbool.h.