Ich habe bemerkt, dass der Linux-Kernel-Code Bool verwendet, aber ich dachte, dass Bool ein C++ - Typ sei. Ist bool eine Standard-C-Erweiterung (z. B. ISO C90) oder eine GCC-Erweiterung?
bool
existiert in der aktuellen C-C99, aber nicht in C89/90.
In C99 heißt der native Typ tatsächlich _Bool
, während bool
ein in stdbool.h
definiertes Standardbibliotheksmakro ist (das erwartungsgemäß in _Bool
aufgelöst wird). Objekte vom Typ _Bool
enthalten entweder 0 oder 1, während true
und false
auch Makros aus stdbool.h
sind.
Beachten Sie, BTW, dass dies bedeutet, dass der C-Präprozessor #if true
als #if 0
interpretiert, es sei denn stdbool.h
ist enthalten. Inzwischen muss der C++ - Präprozessor true
als Sprachliteral erkennen.
C99 fügte einen eingebauten _Bool
-Datentyp hinzu (siehe Wikipedia für Details). Wenn Sie #include <stdbool.h>
verwenden, wird bool
als Makro für _Bool
bereitgestellt.
Sie haben insbesondere nach dem Linux-Kernel gefragt. Es nimmt das Vorhandensein von _Bool
an und stellt selbst ein bool
typedef in include/linux/types.h bereit.
Nein, es gibt keine bool
in ISO C90.
Hier 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, der einige andere Unterschiede zu C, wie sie im Kernel und im Standard verwendet werden, behandelt: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
C99 hat es in stdbool.h , aber 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) { ... }
/* 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
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 .__ zu speichern. und 1.
C99 definiert bool, true
und false
in stdbool.h
.
stdbool.h wurde in c99 eingeführt
stdbool.h
definiert die Makros true und false. Denken Sie jedoch daran, dass es als 1 und 0 definiert ist.
Deshalb ist sizeof(true)
4.
Keine solche Sache, wahrscheinlich nur ein Makro für int
C99 fügte einen bool
-Typ hinzu, dessen Semantik sich grundlegend von jenen fast aller Integer-Typen unterscheidet, die zuvor in C vorhanden waren, einschließlich benutzerdefinierter Typen und Compiler-Erweiterungstypen, die für solche Zwecke vorgesehen sind und für die einige Programme "type-def" haben. ed zu bool
.
Bei Angabe von bool a = 0.1, b=2, c=255, d=256;
würde der Typ C99 bool
alle vier Objekte auf 1 setzen. Wenn ein C89-Programm typedef unsigned char bool
verwendet, erhalten die Objekte 0, 1, 255 bzw. 0. Wenn char
verwendet wurde, könnten die Werte wie oben angegeben sein oder c
könnte -1 sein. Wenn der Compiler-Erweiterungsnamen bit
oder __bit
verwendet worden wäre, würden die Ergebnisse wahrscheinlich 0, 0, 1, 0 sein (Behandlung von bit
in einer Weise, die einem vorzeichenlosen Bitfeld der Größe 1 entspricht oder einem vorzeichenlosen Integer-Typ mit einem Wert bisschen).