Mir ist aufgefallen, 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?
Ist bool ein nativer C-Typ?
asussex
AnT steht zu Russland
bool
existiert im aktuellen C – C99, aber nicht in C89/90.
In C99 heißt eigentlich der native Typ _Bool
während bool
ist ein Standardbibliotheksmakro, das in definiert ist stdbool.h
(was sich erwartungsgemäß auflöst _Bool
). Objekte des Typs _Bool
Halten Sie entweder 0 oder 1, während true
und false
sind auch Makros aus stdbool.h
.
Beachten Sie übrigens, dass dies impliziert, dass der C-Präprozessor interpretiert #if true
wie #if 0
wenn nicht stdbool.h
ist enthalten. In der Zwischenzeit ist der C++-Präprozessor für die native Erkennung erforderlich true
als Sprachliteral.
-
Es gibt einen neuen ISO C-Standard, der 2011 veröffentlicht wurde (nachdem diese Antwort veröffentlicht wurde). ANSI hat wie üblich den ISO C11-Standard als ANSI-Standard übernommen. Aus historischen Gründen bezieht sich der Ausdruck “ANSI C” üblicherweise (aber fälschlicherweise) auf die Sprache, die durch den Standard ANSI C89 / ISO C90 definiert ist. Da C-Normen jetzt zuerst von ISO veröffentlicht werden und es drei ISO-C-Normen mit unterschiedlichem Verbreitungsgrad gegeben hat, ist es am besten, sich auf das Jahr zu beziehen, in dem die Norm veröffentlicht wurde (ISO C90, ISO C99, ISO C11), um irgendwelche zu vermeiden Verwirrtheit.
– Keith Thompson
11. Juli 2013 um 20:40 Uhr
-
Heißt das
_Bool
nimmt 1 Bit Speicher?– Geremia
1. Februar 2016 um 22:39 Uhr
-
@Geremia: Nein. Warum? In C muss jedes adressierbare Objekt mindestens 1 Byte belegen. Und in realen Implementierungen
_Bool
benötigt normalerweise 1 Byte Speicher. Die Sprachspezifikation erlaubt jedoch explizit die Verwendung_Bool
als Bitfeldtyp, was bedeutet, dass Sie durch die Verwendung von Bitfeldern a quetschen können_Bool
Wert in ein einzelnes Bit (innerhalb einer größeren Struktur).– AnT steht zu Russland
2. Februar 2016 um 0:17 Uhr
-
@AnT Wie könnte a
_Bool
Wert sowohl direkt adressierbar (dh 1 Byte groß) als auch an einem Bitfeld teilnehmen? Eine Reihe von_Bool
würde immer noch erfordern, dass alle seine Elemente adressierbar sind (z_Bool* ptr = &boolArray[123]
).– Dai
5. April 2020 um 0:05 Uhr
-
@Dai Ihre Bemerkungen verdienen es, eine völlig separate SO-Frage zu sein.
– Daniel
19. Oktober 2020 um 8:00 Uhr
Josh Kelley
C99 hat ein eingebautes hinzugefügt _Bool
Datentyp (vgl Wikipedia für Details), und wenn Sie #include <stdbool.h>
es bietet bool
als Makro zu _Bool
.
Sie haben insbesondere nach dem Linux-Kernel gefragt. Es setzt das Vorhandensein von voraus _Bool
und bietet a bool
typedef selbst ein include/linux/types.h.
-
Der Grund dafür ist, dass es undefiniert und neu definiert werden darf, wenn seine Definition zu einem Konflikt mit Legacy-Code führen könnte.
– Clifford
23. Oktober 2009 um 21:41 Uhr
rauben
C99 hat es drin stdbool.haber in C90 muss es als typedef oder enum definiert werden:
typedef int bool;
#define TRUE 1
#define FALSE 0
bool f = FALSE;
if (f) { ... }
Alternative:
typedef enum { FALSE, TRUE } boolean;
boolean b = FALSE;
if (b) { ... }
-
Beachten Sie, dass sich das Verhalten von typedef von dem des C99 unterscheidet
bool
und auch anders als bei vielen Compilernbit
Typen. Zum Beispiel,bool x=4294967296LL;
oderbool x=0.1;
würde setzenx
auf eins auf C99, würde aber wahrscheinlich die meisten Typedef-Versionen auf Null setzen.– Superkatze
18. Mai 2016 um 21:48 Uhr
Bobby Shaftoe
Nein, es gibt keine bool
bei ISO C90.
Hier ist eine Liste von Schlüsselwörtern 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
Hier ist ein Artikel, in dem einige diskutiert werden Sonstiges Unterschiede zu C, wie es im Kernel und im Standard verwendet wird: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
Benutzer2705144
/* 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. */
-
Die Anfangswerte sind völlig unnötig.
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.)– Keith Thompson
21. August 2013 um 20:38 Uhr
-
@KeithThompson Anfängliche Werte sind möglicherweise unnötig, aber diese Antwort wählt sie auf sehr elegante Weise aus, nicht mit willkürlichen Werten, sondern unter Verwendung der eigenen Semantik der Sprachen und lässt den Compiler entscheiden.
– MestreLion
16. Februar 2015 um 5:21 Uhr
-
@MestreLion: Das garantiert die eigene Semantik der Sprache
typedef enum { false, true } bool;
funktioniert genau wie erwartet.1 == 0
und! false
sind nicht elegant, sie sind nur verschleiert. Der Compiler muss keine Entscheidung treffen; sie muss der durch die Sprache definierten Semantik gehorchen.– Keith Thompson
16. Februar 2015 um 5:47 Uhr
-
@KeithThompson: Ich glaube nicht, dass sie verschleiert sind, ich denke, die Absicht des Autors war es, die “natürlichsten” Werte auszuwählen:
false
wird auf den Wert gesetzt, der laut Sprache eine Ungleichung auswerten soll, undtrue
zu seinem “Gegenteil” (wieder, was auch immer das ist). Auf diese Weise sollte es einem egal sein, ob das {1, 0}, {-1, 0}, {0, 1} usw. ist, und es funktioniert garantiert in Vergleichen, weil es so war gefertigt mit einem.– MestreLion
16. Februar 2015 um 5:55 Uhr
-
@MestreLion: Jeder, der C kennt, kennt die numerischen Werte von
false
undtrue
. Jeder, der C nicht kennt, ist nicht das erwartete Publikum für C-Code. Und wie gesagt, C hat seit dem vorigen Jahrtausend einen eingebauten booleschen Typ.– Keith Thompson
16. Februar 2015 um 5:59 Uhr
pmg
_Bool
ist ein Schlüsselwort in C99: Es gibt einen Typ an, genau wie int
oder double
.
6.5.2
2 Ein als Typ _Bool deklariertes Objekt ist groß genug, um die Werte 0 und 1 zu speichern.
-
Die Anfangswerte sind völlig unnötig.
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.)– Keith Thompson
21. August 2013 um 20:38 Uhr
-
@KeithThompson Anfängliche Werte sind möglicherweise unnötig, aber diese Antwort wählt sie auf sehr elegante Weise aus, nicht mit willkürlichen Werten, sondern unter Verwendung der eigenen Semantik der Sprachen und lässt den Compiler entscheiden.
– MestreLion
16. Februar 2015 um 5:21 Uhr
-
@MestreLion: Das garantiert die eigene Semantik der Sprache
typedef enum { false, true } bool;
funktioniert genau wie erwartet.1 == 0
und! false
sind nicht elegant, sie sind nur verschleiert. Der Compiler muss keine Entscheidung treffen; sie muss der durch die Sprache definierten Semantik gehorchen.– Keith Thompson
16. Februar 2015 um 5:47 Uhr
-
@KeithThompson: Ich glaube nicht, dass sie verschleiert sind, ich denke, die Absicht des Autors war es, die “natürlichsten” Werte auszuwählen:
false
wird auf den Wert gesetzt, der laut Sprache eine Ungleichung auswerten soll, undtrue
zu seinem “Gegenteil” (wieder, was auch immer das ist). Auf diese Weise sollte es einem egal sein, ob das {1, 0}, {-1, 0}, {0, 1} usw. ist, und es funktioniert garantiert in Vergleichen, weil es so war gefertigt mit einem.– MestreLion
16. Februar 2015 um 5:55 Uhr
-
@MestreLion: Jeder, der C kennt, kennt die numerischen Werte von
false
undtrue
. Jeder, der C nicht kennt, ist nicht das erwartete Publikum für C-Code. Und wie gesagt, C hat seit dem vorigen Jahrtausend einen eingebauten booleschen Typ.– Keith Thompson
16. Februar 2015 um 5:59 Uhr
Nr
C99 definiert bool, true
und false
in stdbool.h
.
§ 9 des comp.lang.c FAQ diskutiert dies.
– Keith Thompson
11. Juli 2013 um 20:46 Uhr
Direkte Verbindung: c-faq.com/bool/index.html
– Ellen Spertus
5. Mai 2017 um 19:08 Uhr
Der Linux-Kernel verwendet
-std=gnu89
was unterstützt_Bool
als Erweiterung zu C90. “include/linux/types.h” hattypedef _Bool bool;
.– Ian Abbott
13. März 2020 um 16:01 Uhr
Außerdem war FWIW, der Linux-Kernel 2.6.19, die erste Version, die verwendet wurde
typedef _Bool bool;
(verpflichten 6e21828743247270d09a86756a0c11702500dbfb) und erforderte GNU C 3.2 oder höher.– Ian Abbott
13. März 2020 um 16:41 Uhr