리눅스 커널 코드가 bool을 사용한다는 것을 알았지 만 bool은 C ++ 유형이라고 생각했습니다. bool은 표준 C 확장 (예 : ISO C90) 또는 GCC 확장입니까?
답변
bool
현재 C-C99에는 있지만 C89 / 90에는 없습니다.
C99에서 기본 유형은 실제로라고 _Bool
하면서, bool
에 정의 된 표준 라이브러리 매크로입니다 stdbool.h
(이 예상대로 결의에이 _Bool
). 유형의 개체 _Bool
동안 보류 0 또는 1 true
및 false
도에서 매크로입니다 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
답변
아니요, bool
ISO 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. */
답변
_Bool
C99의 키워드 : int
또는 처럼 유형을 지정합니다 double
.
6.5.2
2 _Bool 유형으로 선언 된 객체는 값 0과 1을 저장하기에 충분히 큽니다.
답변
C99은 부울을 정의 true
하고 false
에서 stdbool.h
.