Ich habe festgestellt, dass der Linux-Kernel-Code Bool verwendet, aber ich dachte, dass Bool ein C ++ - Typ ist. Ist bool eine Standard-C-Erweiterung (z. B. ISO C90) oder eine GCC-Erweiterung?
c
gcc
linux-kernel
boolean
Asussex
quelle
quelle
-std=gnu89
die Stützen_Bool
als Erweiterung C90. "include / linux / types.h" hattypedef _Bool bool;
.typedef _Bool bool;
(Commit 6e21828743247270d09a86756a0c11702500dbfb ) und erforderte GNU C 3.2 oder höher.Antworten:
bool
existiert im aktuellen C - C99, aber nicht in C89 / 90.In C99 wird der native Typ tatsächlich aufgerufen
_Bool
, währendbool
ein Standardbibliotheksmakro definiert iststdbool.h
(das voraussichtlich in aufgelöst wird_Bool
). Objekte vom Typ enthalten_Bool
entweder 0 oder 1, währendtrue
undfalse
sind auch Makros vonstdbool.h
.Übrigens, dies impliziert, dass der C-Präprozessor so interpretiert wird,
#if true
als wäre er#if 0
nichtstdbool.h
enthalten. In der Zwischenzeit muss der C ++ - Präprozessor nativtrue
als Sprachliteral erkannt werden .quelle
_Bool
1 Bit Speicherplatz benötigt wird?_Bool
normalerweise 1 Byte Speicher. Die Sprachspezifikation erlaubt jedoch ausdrücklich die Verwendung_Bool
als Bitfeldtyp, was bedeutet, dass Sie durch die Verwendung von Bitfeldern einen_Bool
Wert in ein einzelnes Bit (innerhalb einer größeren Struktur) drücken können ._Bool
Wert sowohl direkt adressierbar sein (dh 1 Byte groß sein) als auch an einem Bitfeld teilnehmen? Ein Array von_Bool
würde immer noch erfordern, dass alle seine Elemente adressierbar sind (z_Bool* ptr = &boolArray[123]
. B. ).C99 hat einen eingebauten
_Bool
Datentyp hinzugefügt (siehe Wikipedia für Details), und wenn Sie#include <stdbool.h>
dies tun , wird erbool
als Makro bereitgestellt_Bool
.Sie haben insbesondere nach dem Linux-Kernel gefragt. Es setzt das Vorhandensein von
_Bool
und stellt selbst einbool
typedef in include / linux / types.h bereit .quelle
Nein, es gibt keine
bool
in ISO C90.Hier ist eine Liste der Schlüsselwörter in Standard C (nicht 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
In diesem Artikel werden einige andere Unterschiede zu C erläutert, wie sie im Kernel und im Standard verwendet werden: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
quelle
C99 hat es in stdbool.h , aber in C90 muss es als typedef oder enum definiert sein:
Alternative:
quelle
bool
und auch von dem vieler Compilertypenbit
unterscheidet. Zum Beispielbool x=4294967296LL;
oderbool x=0.1;
würdex
auf C99 auf eins gesetzt, würde aber wahrscheinlich die meisten typedef-Versionen auf null setzen.quelle
typedef enum { false, true };
ist genauso gut. Wenn Sie darauf bestehen, expliziter zu sein, können Sie schreibentypedef enum { false = 0, true = 1 };
. (Oder nur,#include <stdbool.h>
wenn Ihr Compiler es unterstützt; es ist seit 14 Jahren Standard.)typedef enum { false, true } bool;
genau wie erwartet funktioniert.1 == 0
und! false
sind nicht elegant, sie sind nur verschleiert. Der Compiler muss keine Entscheidung treffen. es muss der durch die Sprache definierten Semantik gehorchen.false
auf den Wert gesetzt, zu dem die Sprache sagt, dass eine Ungleichung bewertet werden sollte, undtrue
auf das "Gegenteil" ( wieder was auch immer das ist). Dieser Weg soll es egal , ob das heißt {1, 0}, {-1, 0}, {0, 1}, etc, und es wird in Vergleich zu der Arbeit garantiert, denn es wurde in Handarbeit eines verwenden.false
undtrue
. Wer C nicht kennt, ist nicht die erwartete Zielgruppe für C-Code. Und wie gesagt, C hat seit dem letzten Jahrtausend einen eingebauten Booleschen Typ._Bool
ist ein Schlüsselwort in C99: Es gibt einen Typ an, genau wieint
oderdouble
.quelle
C99 definiert bool
true
undfalse
instdbool.h
.quelle
stdbool.h wurde in c99 eingeführt
quelle
stdbool.h
definiert Makros als wahr und falsch, aber denken Sie daran, dass sie als 1 und 0 definiert sind.Deshalb
sizeof(true)
ist 4.quelle
Kein solches Ding, wahrscheinlich nur ein Makro für int
quelle
bool
Art.C99 fügte einen
bool
Typ hinzu, dessen Semantik sich grundlegend von der nahezu aller Ganzzahltypen unterscheidet, die zuvor in C vorhanden waren, einschließlich benutzerdefinierter und Compiler-Erweiterungstypen, die für solche Zwecke vorgesehen sind und die einige Programme möglicherweise "typdefiniert" haben zubool
.Beispielsweise würde
bool a = 0.1, b=2, c=255, d=256;
derbool
Typ C99 alle vier Objekte auf 1 setzen. Wenn ein C89-Programm verwendet würdetypedef unsigned char bool
, würden die Objekte 0, 1, 255 bzw. 0 empfangen. Wenn es verwendet wirdchar
, können die Werte wie oben oderc
-1 sein. Wenn eine Compiler-Erweiterungbit
oder ein Compiler-__bit
Typ verwendet worden wäre, wären die Ergebnisse wahrscheinlich 0, 0, 1, 0 (Behandlungbit
in einer Weise, die einem vorzeichenlosen Bitfeld der Größe 1 oder einem vorzeichenlosen Integer-Typ mit einem Wertbit entspricht).quelle