Вопрос

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

Это было полезно?

Решение

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

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

Обратите внимание, что это означает, что препроцессор C будет интерпретировать <=> как <=>, если <=> не включено. Между тем, препроцессор C ++ должен распознавать <=> как языковой литерал.

Другие советы

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

Вы спрашивали о ядре Linux, в частности. Он предполагает наличие <=> и сам предоставляет <=> typedef в включают в себя / Linux / types.h .

Нет, здесь нет никакого 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 есть это в стандартный код.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 определяет bool, true и false в stdbool.h.

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

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

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

Нет такого, вероятно, просто макрос для int

C99 добавил тип bool, семантика которого принципиально отличается от таковых практически всех целочисленных типов, которые существовали ранее в C, включая определяемые пользователем типы и расширения компилятора, предназначенные для таких целей, и которые могут иметь некоторые программы " type-def " переведено в bool a = 0.1, b=2, c=255, d=256;.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top