Ist bool eine native C-Typ?
-
05-07-2019 - |
Frage
Ich habe bemerkt, dass der Linux-Kernel-Code Bool verwendet, aber ich dachte, dass Bool ein C ++ Typ war. Ist bool eine Standard-C-Erweiterung (zum Beispiel ISO C90) oder eine GCC-Erweiterung?
Lösung
bool
existiert in der aktuellen C - C99, aber nicht in C89 / 90
In C99 der nativen Typ ist eigentlich _Bool
genannt, während bool
eine Standardbibliothek Makro in stdbool.h
definiert ist (was löst expectedly _Bool
). Objekte vom Typ _Bool
halten entweder 0 oder 1, während true
und false
auch aus stdbool.h
Makros werden.
Beachten Sie, BTW, dass dies bedeutet, dass C-Präprozessor #if true
als #if 0
interpretieren wird, es sei denn stdbool.h
enthalten ist. Inzwischen ist C ++ Präprozessor benötigt, um nativ true
als wörtliche Sprache zu erkennen.
Andere Tipps
C99 hat einen eingebauten _Bool
Datentyp (siehe Wikipedia für Details), und wenn Sie #include <stdbool.h>
, es bietet bool
als Makro _Bool
.
Sie haben gefragt, um den Linux-Kernel im Besonderen. Er geht davon aus, das Vorhandensein von _Bool
und bietet eine bool
typedef sich in include / linux / types.h .
Nein, es gibt keine bool
in 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 diskutiert einige andere Unterschiede mit C wie im Kernel und Standard verwendet: 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) { ... }
Alternativ:
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 eine Art, wie int
oder double
6.5.2
2 Ein Objekt deklariert als Typ _Bool ist groß genug, um die Werte zu speichern 0 und 1.
C99 definiert Bool, true
und false
in stdbool.h
.
stdbool.h wurde in c99 eingeführt
stdbool.h
definiert Makros wahr und falsch, aber nicht vergessen, es definiert sein 1 und 0
Deshalb sizeof(true)
4 ist.
So etwas, wahrscheinlich nur ein Makro für int
C99 hat einen bool
Typ, dessen Semantik von denen grundsätzlich verschieden sind fast alle Integer-Typen, die vor dem in C bestanden hatte, einschließlich benutzerdefiniert und Compiler-Erweiterungstypen für solche Zwecke bestimmt sind, und die können einige Programme haben „Typ -def "ed bool
.
Zum Beispiel gegeben bool a = 0.1, b=2, c=255, d=256;
, die C99 bool
Typ würde gesetzt, alle vier Objekte auf 1. Wenn ein C89-Programm verwendet typedef unsigned char bool
, würden die Objekte 0 erhalten, 1, 255, bzw. 0. Wenn es char
verwendet, könnten die Werte wie oben sein, oder c
könnte -1 sein. Wenn es einen Compiler-extension bit
oder __bit
Typ verwendet hätte, wäre das Ergebnis wahrscheinlich 0, 0, 1, 0 (Behandlung bit
auf eine Weise äquivalent zu einer unsigned Bitfeld der Größe 1 oder eine ganze Zahl ohne Vorzeichen-Typ mit einem Wert bit).