리눅스 커널 코드가 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
답변
아니요, boolISO C90 에는 없습니다 .
표준 C (C99 아님)의 키워드 목록은 다음과 같습니다.
autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedstaticstructswitchtypedefunionunsignedvoidvolatilewhile
다음 은 커널 및 표준에서 사용되는 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.
