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


265

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


2
comp.lang.c FAQ 의 섹션 9에서 이에 대해 설명합니다.
Keith Thompson


Linux 커널은 C90의 확장으로 -std=gnu89지원 _Bool하는 것을 사용 합니다 . "include / linux / types.h"에 있습니다 typedef _Bool bool;.
이언 애보트

또한 FWIW에서 Linux 커널 2.6.19는 사용하는 첫 번째 버전 typedef _Bool bool;(commit 6e21828743247270d09a86756a0c11702500dbfb )이며 GNU C 3.2 이상이 필요했습니다.
이언 애보트

답변:


368

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언어 리터럴로 인식해야합니다 .


62
이 답변이 게시 된 후 2011 년에 새로운 ISO C 표준이 발표되었습니다. 평소와 같이 ANSI는 ISO C11 표준을 ANSI 표준으로 채택했습니다. 역사적 이유로 "ANSI C"라는 문구는 ANSI C89 / ISO C90 표준에 의해 정의 된 언어를 의미합니다. C 표준은 이제 ISO에 의해 먼저 공개되고 다양한 채택 수준을 가진 세 가지 ISO C 표준이 있으므로 표준을 공개하지 않은 연도 (ISO C90, ISO C99, ISO C11)를 참조하여 모든 표준을 피하는 것이 가장 좋습니다 착란.
키이스 톰슨

8
이것이 _Bool1 비트의 메모리를 차지 한다는 의미 입니까?
Geremia

27
@Geremia : 아니요. 왜 그렇습니까? C에서 각 주소 지정 가능 객체는 1 바이트 이상을 차지해야합니다. 실제 구현에서는 _Bool일반적으로 1 바이트의 메모리가 필요합니다. 그러나 언어 사양에서는 명시 적 _Bool으로 비트 필드 유형으로 사용할 수 있습니다. 즉, 비트 필드를 사용하면 _Bool값을 단일 비트 (더 큰 구조체 내부)로 압축 할 수 있습니다 .
AnT

@AnT 어떻게 _Bool값을 직접 주소 지정할 수 있고 (예 : 1 바이트 크기) 비트 필드에 참여할 수 있습니까? 의 배열 _Bool은 여전히 ​​모든 요소의 주소를 지정할 수 있어야합니다 (예 :) _Bool* ptr = &boolArray[123].
다이

118

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

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


26
그 이유는 정의가 레거시 코드와 충돌을 일으킬 수있는 곳에서 정의되지 않고 재정의되도록 허용하는 것입니다.
Clifford

32

아니요, 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


6
실용적인 목적으로 여전히 괜찮은 컴파일러 지원이없는 한 실제로 중요합니까? gcc조차도 최근까지 C99 기능의 절반이 없었으며, MSVC에는 이러한 기능이 거의 없었으며 아마도 없을 것입니다.
Pavel Minaev

5
질문자 @Jonathan Leffler는 ISO C90에 대해 구체적으로 물었습니다. :) 사실, 사람들이 일반적으로 ANSI C를 언급 할 때는 C90을 측정합니다. 나는 C99를 사용하지 않거나 실제로 사용할 계획이며 많은 사람들이 같은 느낌이라고 생각합니다.
BobbyShaftoe

6
@BobbyShaftoe : 원래 포스터는 C90이 예제라고 명시 적으로 언급했습니다.
Keith Thompson

32

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

5
typedef의 동작은 C99의 동작 bool과 다르며 많은 컴파일러 bit유형 의 동작과 다릅니다 . 예를 들어 bool x=4294967296LL;또는 C99에서 1로 bool x=0.1;설정 x되지만 대부분의 typedef 버전은 0으로 설정 될 수 있습니다.
supercat

17
/* 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. */

16
초기 값은 전적으로 불필요합니다. typedef enum { false, true };마찬가지로 좋다. 좀 더 명시 적으로 고집한다면을 쓸 수 있습니다 typedef enum { false = 0, true = 1 };. (또는 #include <stdbool.h>컴파일러가 지원한다면 14 년 동안 표준이되었습니다.)
Keith Thompson

9
@KeithThompson 초기 값은 불필요 할 수 있지만이 답변은 임의의 값이 아니라 언어 자체의 의미를 사용하고 컴파일러가 결정할 수 있도록 매우 우아한 방식으로 값을 선택합니다.
MestreLion

11
@MestreLion : 언어 자체의 의미론이 typedef enum { false, true } bool;예상대로 작동합니다. 1 == 0그리고 ! false우아하지, 그들은 단지 난독 화하고 있습니다. 컴파일러가 결정할 결정은 없습니다. 언어에 의해 정의 된 의미론을 준수해야합니다.
Keith Thompson

11
@ KeithThompson : 나는 그들이 난독 화되지 않다고 생각합니다. 저자의 의도는 가장 "자연적인"값을 선택하는 것 같아요 : false언어가 불평등을 평가해야한다고 말하는 값과 true"반대"로 설정됩니다. 다시, 그것이 무엇이든간에). 이런 식으로 {1, 0}, {-1, 0}, {0, 1} 등이면 신경 쓰지 않아야하며, 하나를 사용하여 만들어 졌기 때문에 비교에서 작동하도록 보장됩니다 .
MestreLion

3
@MestreLion : C를 아는 사람은 false및 의 숫자 값을 알고 true있습니다. C를 모르는 사람은 C 코드의 예상 대상이 아닙니다. 그리고 내가 말했듯이, C는 이전 밀레니엄 이후에 부울 타입을 내장했습니다.
키이스 톰슨

12

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

6.5.2

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




1

stdbool.h 매크로를 참과 거짓으로 정의하지만 1과 0으로 정의 된 것을 기억하십시오.

그렇기 때문에 sizeof(true)4입니다.


0

그런 것은 없으며 아마도 int의 매크로 일 것입니다.


-1의 좋은 점 ... 문제는 99가 아니라 C90이었습니다.
sindre j

5
글쎄 그는 C 표준, 예를 들어 C90 이라고 말합니다 . 나는 그것이 C99를 포함한다고 가정합니다.
Matt Joiner

2
그는 C90이 아닌 C90을 구체적으로 언급하므로 그가 의미하는 바를 가정합니다. Wikipedia에 따르면 C99를 완벽하게 지원하는 유일한 컴파일러는 Sun Microsystems의 Sun Studio입니다. 이제는 널리 받아 들여지지 않는 표준입니까? 아마도 대부분의 현대 컴파일러는 C99 표준의 일부를 구현하지만 아마도 당신과 같은 어리석은 의견을 피하기 위해 언급했을 것입니다! 이 btw와 관련하여 Java 또는 C #은 무엇입니까?
sindre j

8
표준 C 확장 (예 : ISO C90) 은 특히 ​​C90 자체가 아니라 관심있는 C 표준의 종류를 분류합니다. 이에 대한 적절한 대답은,이다 , 특히 C99 표준과 같은 C90 표준은 C가, 않습니다 구현 bool유형입니다.
Matt Joiner

0

C99 bool는 시맨틱이 C에서 이전에 존재했던 거의 모든 정수 유형과 의미가 근본적으로 다른 유형을 추가했습니다. 이러한 목적을 위해 의도 된 사용자 정의 및 컴파일러 확장 유형을 포함하며 일부 프로그램은 "type-def" 에 bool.

예를 들어, 주어진 bool a = 0.1, b=2, c=255, d=256;C99 bool유형은 4 개의 객체를 모두 1로 설정합니다. C89 프로그램이 사용 된 typedef unsigned char bool경우 객체는 각각 0, 1, 255 및 0을받습니다. 사용 된 경우 char값은 위와 같거나 c-1 일 수 있습니다. 컴파일러 확장 bit또는 __bit유형을 사용한 경우 결과는 0, 0, 1, 0입니다 (1 bit의 부호없는 비트 필드 또는 하나의 값 비트의 부호없는 정수 유형과 동일한 방식으로 처리 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.