Bool является родным типом C?

199

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

  • 1
    Раздел 9 FAQ по comp.lang.c обсуждает это.
  • 0
    Прямая ссылка: c-faq.com/bool/index.html
Теги:
gcc
linux-kernel
boolean

10 ответов

269
Лучший ответ

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

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

  • 59
    Существует новый стандарт ISO C, опубликованный в 2011 году (после публикации этого ответа). ANSI, как обычно, принял стандарт ISO C11 в качестве стандарта ANSI. По историческим причинам фраза «ANSI C» обычно (но не полностью) относится к языку, определенному стандартом ANSI C89 / ISO C90. Поскольку стандарты C в настоящее время публикуются ISO впервые, и поскольку существует три стандарта ISO C с различными уровнями принятия, лучше всего обратиться к году, когда был опубликован стандарт (ISO C90, ISO C99, ISO C11), чтобы избежать любых спутанность сознания.
  • 7
    Означает ли это, что _Bool занимает 1 бит памяти?
Показать ещё 1 комментарий
113

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

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

  • 26
    Что касается того, почему, это - позволить это не быть неопределенным и переопределенным, где его определение могло вызвать столкновение с унаследованным кодом.
27

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) { ... }
  • 4
    Обратите внимание, что поведение typedef будет отличаться от поведения bool C99, а также от bit типов многих компиляторов. Например, bool x=4294967296LL; или bool x=0.1; установит x в единицу на C99, но, скорее всего, установит для большинства версий typedef значение ноль
27

Нет, в 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

  • 6
    Для практических целей, действительно ли это имеет значение, пока еще нет достойной поддержки компилятора? Даже у gcc до недавнего времени не было половины функций C99, а MSVC не имеет большинства из них, и, вероятно, никогда не будет ...
  • 5
    @ Джонатан Леффлер, специально задаваемый вопрос о ISO C90. :) На самом деле, обычно, когда люди обращаются к ANSI C, они имеют в виду C90. Я не использую или не планирую использовать C99, и я думаю, что многие чувствуют то же самое.
Показать ещё 1 комментарий
12
/* 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. */
  • 13
    Начальные значения совершенно не нужны. typedef enum { false, true }; это так же хорошо. Если вы настаиваете на том, чтобы быть более явным, вы можете написать typedef enum { false = 0, true = 1 }; , (Или просто #include <stdbool.h> если ваш компилятор поддерживает его; он был стандартным в течение 14 лет.)
  • 7
    @KeithThompson Начальные значения могут быть ненужными, но этот ответ выбирает их очень элегантным способом, не с произвольными значениями, а с использованием собственной семантики языков и предоставляя возможность компилятору решать.
Показать ещё 4 комментария
11

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

6.5.2

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

4

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

1

stdbool.h был введен в c99

0

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

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

0

Нет такой вещи, возможно, просто макроса для int

  • 3
    C99 добавил это.
  • 0
    Хорошо с -1 ... вопрос был C90, а не 99, я считаю
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню