Я заметил, что код ядра Linux использует bool, но я подумал, что bool - это тип C ++. Является ли bool стандартным расширением C (например, ISO C90) или расширением GCC?
c
gcc
linux-kernel
boolean
asussex
источник
источник
-std=gnu89
который поддерживает_Bool
как расширение C90. "include / linux / types.h" имеетtypedef _Bool bool;
.typedef _Bool bool;
(commit 6e21828743247270d09a86756a0c11702500dbfb ) и требовала GNU C 3.2 или более поздней версии .Ответы:
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
в качестве литерала языка.источник
_Bool
занимает 1 бит памяти?_Bool
обычно занимает 1 байт памяти. Однако спецификация языка явно разрешает использование в_Bool
качестве типа битовых полей, что означает, что с помощью битовых полей вы можете сжать_Bool
значение в один бит (внутри большей структуры)._Bool
значение может быть как непосредственно адресуемым (т.е. размером 1 байт), так и участвовать в битовом поле? Массив по-_Bool
прежнему требует адресации всех его элементов (например,_Bool* ptr = &boolArray[123]
).C99 добавил встроенный
_Bool
тип данных ( подробности см. В Википедии ) и, если вы#include <stdbool.h>
, он предоставляетbool
в качестве макроса_Bool
.Вы спрашивали о ядре Linux в частности. Он предполагает наличие
_Bool
и сам предоставляетbool
typedef в include / 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 это есть в stdbool.h , но в C90 это должно быть определено как typedef или enum:
В качестве альтернативы:
источник
bool
, а также от типов многих компиляторовbit
. Например,bool x=4294967296LL;
илиbool x=0.1;
будет установленx
на один на C99, но, скорее всего, установит большинство версий typedef на ноль.источник
typedef enum { false, true };
это так же хорошо. Если вы настаиваете на том, чтобы быть более явным, вы можете написатьtypedef enum { false = 0, true = 1 };
. (Или просто,#include <stdbool.h>
если ваш компилятор поддерживает его; он был стандартным в течение 14 лет.)typedef enum { false, true } bool;
работает точно так, как ожидалось.1 == 0
и! false
не элегантны, они просто запутаны. Компилятор не принимает никакого решения; он должен подчиняться семантике, определенной языком.false
установлено любое значение, согласно которому язык должен оценивать неравенство, иtrue
его "противоположность" ( опять же, что бы это ни было). Таким образом, не нужно заботиться, если это {1, 0}, {-1, 0}, {0, 1} и т. Д., И он гарантированно будет работать в сравнениях, потому что он был создан с использованием единицы.false
иtrue
. Тот, кто не знает C, не является ожидаемой аудиторией для C-кода. И, как я уже сказал, C имеет встроенный логический тип с прошлого тысячелетия._Bool
это ключевое слово в C99: оно определяет тип, какint
илиdouble
.источник
C99 определяет bool,
true
иfalse
вstdbool.h
.источник
stdbool.h был представлен в c99
источник
stdbool.h
определяет макросы true и false, но помните, что они определены как 1 и 0.Вот почему
sizeof(true)
4.источник
Нет такой вещи, вероятно, просто макрос для int
источник
bool
тип.В C99 добавлен
bool
тип, семантика которого принципиально отличается от таковых практически всех целочисленных типов, которые существовали ранее в C, включая определяемые пользователем типы и расширения компилятора, предназначенные для таких целей, и которые некоторые программы могут иметь «type-def» ed кbool
.Например, учитывая
bool a = 0.1, b=2, c=255, d=256;
, чтоbool
тип C99 установит все четыре объекта на 1. Если используется программа C89typedef unsigned char bool
, объекты получат 0, 1, 255 и 0 соответственно. Если он используетсяchar
, значения могут быть такими же, как указано выше, илиc
могут быть -1. Если бы он использовал расширениеbit
или__bit
тип компилятора , результаты, вероятно, были бы 0, 0, 1, 0 (обрабатываяbit
таким образом, чтобы это было эквивалентно битовому полю без знака размера 1 или целочисленному типу без знака с одним битом значения).источник