Bool является родным типом C? - PullRequest
243 голосов
/ 22 октября 2009

Я заметил, что код ядра Linux использует bool, но я думал, что bool был типом C ++. Является ли bool стандартным расширением C (например, ISO C90) или расширением GCC?

Ответы [ 11 ]

339 голосов
/ 22 октября 2009

bool существует в текущем C - C99, но не в C89 / 90.

В C99 собственный тип фактически называется _Bool, тогда как bool - это стандартный библиотечный макрос, определенный в stdbool.h (который, как ожидается, разрешается до _Bool). Объекты типа _Bool содержат 0 или 1, тогда как true и false также являются макросами из stdbool.h.

Обратите внимание, что это означает, что препроцессор C будет интерпретировать #if true как #if 0, если не включен stdbool.h. Между тем, препроцессор C ++ необходим для естественного распознавания true как литерала языка.

115 голосов
/ 22 октября 2009

C99 добавил встроенный тип данных _Bool (подробнее см. Википедия ), и если вы #include <stdbool.h>, он предоставит bool в качестве макроса для _Bool.

Вы спрашивали о ядре Linux, в частности. Он предполагает наличие _Bool и сам обеспечивает определение типа bool в include / linux / types.h .

32 голосов
/ 22 октября 2009

Нет, в ISO C90 нет bool.

Вот список ключевых слов в стандартном 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

29 голосов
/ 22 октября 2009

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) { ... }
15 голосов
/ 22 августа 2013
/* 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. */
11 голосов
/ 22 октября 2009

_Bool - это ключевое слово в C99: оно определяет тип, как int или double.

6.5.2

2 Объект, объявленный как тип _Bool достаточно велик для хранения значений 0 и 1.

6 голосов
/ 22 октября 2009

C99 определяет bool, true и false в stdbool.h.

2 голосов
/ 22 октября 2009

stdbool.h был представлен в c99

1 голос
/ 26 ноября 2017

stdbool.h определяет макросы true и false, но помните, что они определены как 1 и 0.

Вот почему sizeof(true) равно 4.

0 голосов
/ 09 ноября 2018

C99 добавил тип bool, семантика которого принципиально отличается от таковых почти всех целочисленных типов, которые существовали ранее в C, включая определяемые пользователем типы и расширения компилятора, предназначенные для таких целей, и которые могут иметь некоторые программы "type-def" ed bool.

Например, если задано bool a = 0.1, b=2, c=255, d=256;, тип C99 bool установит для всех четырех объектов значение 1. Если программа C89 использует typedef unsigned char bool, объекты получат 0, 1, 255 и 0 соответственно. Если используется char, значения могут быть такими же, как указано выше, или c может быть -1. Если бы он использовал расширение bit или __bit расширения компилятора, результаты, вероятно, были бы равны 0, 0, 1, 0 (обработка bit способом, эквивалентным битовому полю без знака размера 1 или целое число без знака с одним битом значения).

...