it-swarm.com.de

Ist bool ein nativer C-Typ?

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?

234
asussex

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.

327
AnT

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.

115
Josh Kelley

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

32
BobbyShaftoe

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) { ... }
29
Rob
/* 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. */
15
user2705144

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

11
pmg

C99 definiert bool, true und false in stdbool.h.

6
starblue

stdbool.h wurde in c99 eingeführt

2
Nick Van Brunt

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.

1
Neha Gangwar

Keine solche Sache, wahrscheinlich nur ein Makro für int

0
sindre j

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

0
supercat