Ist bool ein nativer C-Typ?

Lesezeit: 7 Minuten

Benutzeravatar von asussex
asussex

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?

  • § 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” hat typedef _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


AnT steht mit Russlands Benutzer-Avatar
AnT steht zu Russland

bool existiert im aktuellen C – C99, aber nicht in C89/90.

In C99 heißt eigentlich der native Typ _Boolwä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

Benutzeravatar von Josh Kelley
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

Benutzeravatar von Rob
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 boolund auch anders als bei vielen Compilern bit Typen. Zum Beispiel, bool x=4294967296LL; oder bool x=0.1; würde setzen x auf eins auf C99, würde aber wahrscheinlich die meisten Typedef-Versionen auf Null setzen.

    – Superkatze

    18. Mai 2016 um 21:48 Uhr

Benutzeravatar von BobbyShaftoe
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

Benutzeravatar von user2705144
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 schreiben typedef 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, und true 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 und true. 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


Benutzeravatar von pmg
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 schreiben typedef 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, und true 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 und true. 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


Benutzeravatar von nbro
Nr

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

1426920cookie-checkIst bool ein nativer C-Typ?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy