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?

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top