Zauważyłem, że kod jądra Linux używa bool, ale myślałem, że bool był typem C ++. Czy bool jest standardowym rozszerzeniem C (np. ISO C90) czy rozszerzeniem GCC?
c
gcc
linux-kernel
boolean
asussex
źródło
źródło
-std=gnu89
które obsługuje_Bool
jako rozszerzenie do C90. „include / linux / types.h” matypedef _Bool bool;
.typedef _Bool bool;
(commit 6e21828743247270d09a86756a0c11702500dbfb ) i wymagało GNU C 3.2 lub nowszego.Odpowiedzi:
bool
istnieje w obecnym C - C99, ale nie w C89 / 90.W C99 wywoływany jest typ macierzysty
_Bool
, podczas gdybool
jest to standardowe makro biblioteki zdefiniowane wstdbool.h
(do którego oczekuje się_Bool
). Obiektów typu_Bool
zawieszone albo 0 albo 1, natomiasttrue
ifalse
są również z makrstdbool.h
.Zauważ, BTW, że oznacza to, że preprocesor C będzie interpretował
#if true
tak, jakby#if 0
niestdbool.h
został uwzględniony. Tymczasem wymagany jest preprocesor C ++, aby natywnie rozpoznaćtrue
literał językowy.źródło
_Bool
zajmuje 1 bit pamięci?_Bool
zwykle zajmują 1 bajt pamięci. Jednak specyfikacja języka wyraźnie zezwala na użycie_Bool
jako typu pola bitowego, co oznacza, że używając pól bitowych możesz wycisnąć_Bool
wartość w pojedynczy bit (wewnątrz większej struktury)._Bool
wartość może być bezpośrednio adresowalna (tzn. Rozmiar 1 bajtu), a także uczestniczyć w polu bitowym? Tablica_Bool
nadal wymagałaby adresowania wszystkich swoich elementów (np_Bool* ptr = &boolArray[123]
.).C99 dodał wbudowany
_Bool
typ danych ( szczegółowe informacje można znaleźć w Wikipedii ), a jeśli tak#include <stdbool.h>
, udostępniabool
on makro jako_Bool
.Pytałeś w szczególności o jądro Linuksa. Zakłada obecność
_Bool
i udostępniabool
sam typedef w include / linux / types.h .źródło
Nie, nie ma go
bool
w ISO C90.Oto lista słów kluczowych w standardzie C (nie 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
Oto artykuł omawiający inne różnice w C używane w jądrze i standardzie: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
źródło
C99 ma go w stdbool.h , ale w C90 musi być zdefiniowany jako typedef lub enum:
Alternatywnie:
źródło
bool
, a także inne niż zachowanie wielubit
typów kompilatorów . Na przykład,bool x=4294967296LL;
czybool x=0.1;
będzie ustawionyx
na jeden z C99, ale najprawdopodobniej ustawiony wersje najbardziej typedef do zera.źródło
typedef enum { false, true };
jest tak samo dobry. Jeśli nalegasz, aby być bardziej wyraźnym, możesz pisaćtypedef enum { false = 0, true = 1 };
. (Lub tylko#include <stdbool.h>
jeśli twój kompilator to obsługuje; jest to standard od 14 lat.)typedef enum { false, true } bool;
działa dokładnie zgodnie z oczekiwaniami.1 == 0
i! false
nie są eleganckie, są jedynie zaciemnione. Kompilator nie musi podjąć żadnej decyzji; musi przestrzegać semantyki określonej przez język.false
jest ustawiony na dowolną wartość, jaką według języka należy oceniać nierówność, itrue
na „przeciwne” ( ponownie, cokolwiek to jest). W ten sposób nie powinno nas obchodzić, czy to {1, 0}, {-1, 0}, {0, 1} itd., I gwarantujemy, że będzie działało w porównaniach, ponieważ zostało stworzone przy użyciu jednego.false
itrue
. Każdy, kto nie zna C, nie jest oczekiwanym odbiorcą kodu C. I jak powiedziałem, C ma wbudowany typ boolowski od poprzedniego tysiąclecia._Bool
jest słowem kluczowym w C99: określa typ, podobnie jakint
lubdouble
.źródło
C99 definiuje bool
true
ifalse
instdbool.h
.źródło
stdbool.h został wprowadzony w c99
źródło
stdbool.h
definiuje makra prawda i fałsz, ale pamiętaj, że zdefiniowano je jako 1 i 0.Dlatego
sizeof(true)
jest 4.źródło
Nic takiego, prawdopodobnie tylko makro dla int
źródło
bool
typu.C99 dodał
bool
typ, którego semantyka jest zasadniczo różna od semantyki prawie wszystkich typów całkowitych, które istniały wcześniej w C, w tym typów zdefiniowanych przez użytkownika i rozszerzeń kompilatora przeznaczonych do takich celów, i które niektóre programy mogą mieć ed dobool
.Na przykład, biorąc pod uwagę
bool a = 0.1, b=2, c=255, d=256;
,bool
typ C99 ustawi wszystkie cztery obiekty na 1. Jeśli użyty zostanie program C89typedef unsigned char bool
, obiekty otrzymają odpowiednio 0, 1, 255 i 0. Jeśli zostanie użytychar
, wartości mogą być takie jak powyżej lubc
mogą wynosić -1. Gdyby użył rozszerzeniabit
lub__bit
typu kompilatora , wyniki prawdopodobnie wynosiłyby 0, 0, 1, 0 (traktowaniebit
w sposób równoważny z niepodpisanym polem bitowym o rozmiarze 1 lub bez znaku liczby całkowitej z jednym bitem wartości).źródło