Was ist Bool in C / C ++? Ein Schlüsselwort oder ein Makro?

7

Ich habe diese Frage genannt, in der einige der Antworten darauf hindeuten, dass bool ist ein ganzzahliger Typ (IDEs behandeln es auch als Schlüsselwort).

In keiner der Antworten wird jedoch auf die Informationen in cplusplus verwiesen, aus denen hervorgeht, dass bool ein Makro ist was durch <cstdbool> hinzugefügt wird (In diesem Fall fügen die Compiler implizit diesen Header hinzu, während sie kompiliert werden, um bool zu erlauben). Hier ist die g ++ - Version von <stdbool.h> .

Also was genau ist die bool ? Ein Schlüsselwort oder ein Makro?

    
iammilind 04.08.2013, 11:02
quelle

6 Antworten

16

In C ist bool ein Makro.

Es gibt keinen integrierten Typ oder Schlüsselwort mit dem Namen bool in C. Daher verwenden typische Implementierungen die Standardbibliothek zu #define true und false zu 1 bzw. 0 . Regeln wie die für die if -Anweisung werden in Form von "Null" - und "Nicht-Null" -Ausdrücken definiert und basieren daher auf den erweiterten Makrodefinitionen von true und false :

  

[C99: 6.8.4.1/2]: In beiden Formularen wird die erste Subanweisung ausgeführt, wenn der Ausdruck ungleich 0 vergleicht. In der else-Form wird die zweite Subanweisung ausgeführt, wenn der Ausdruck gleich 0 ist. Wenn die erste Subanweisung über ein Label erreicht wird , die zweite Subanweisung wird nicht ausgeführt.

Aus praktischen Gründen hat C99 den integrierten Zwischentyp _Bool und Implementierungen dieser Sprache typischerweise #define bool bis _Bool hinzugefügt. Dieser Typ ist folgendermaßen definiert:

  

[C99: 6.2.5/2]: Ein als Typ _Bool deklariertes Objekt ist groß genug, um die Werte 0 und 1 zu speichern.

Dies ermöglicht eine größere Kompatibilität mit C ++ - Programmen, die unter anderem die Deklaration von Funktionen mit dem bool -Typ beinhalten können; wirklich, aber, #define _Bool int hätte wahrscheinlich genügt.

In C ++ ist bool sowohl ein eingebauter Typ als auch ein Schlüsselwort.

Der von Ihnen angegebene Link besagt nicht, dass bool ein Makro in C ++ ist. Es sagt:

  

Der Zweck in C dieses Headers besteht darin, einen Bool-Typ und die wahren und falschen Werte als Makrodefinitionen hinzuzufügen.

     

In C ++, das diese direkt unterstützt, enthält der Header einfach ein Makro, mit dem überprüft werden kann, ob der Typ unterstützt wird.

Und das ist richtig.

Semantisch (in Bezug auf die "Bedeutung" Ihres Codes), [C++11: 3.9.1/2] definiert bool als einen integralen Typ in C ++.

Lexikalisch (in Bezug auf "Aussehen" in Ihrem Code) listet [C++11: 2.12/1] es als Schlüsselwort auf. Tatsächlich sind alle Tokens, die Teil der Namen von ganzzahligen Typen sind, auch Schlüsselwörter, einschließlich (aber nicht beschränkt auf):

  • int
  • unsigned
  • long
  • bool
  • short
  • signed

Es ist jedoch nie ein Makro in C ++. Stattdessen erhalten Sie ein Makro __bool_true_false_are_defined , das Sie in mehrsprachigem Code verwenden können, um die Behandlung von bool zu ändern, je nachdem, ob Sie in C oder C ++ arbeiten. Ich bin mir nicht sicher, ob ich mir ein nützliches Beispiel vorstellen kann, wohlgemerkt.

    
Lightness Races in Orbit 04.08.2013, 11:05
quelle
7

In C bool ist ein Makro von stdbool.h , das zu _Bool expandiert, was der boolesche C-Typ ist.

    
ouah 04.08.2013 11:15
quelle
4
  

Also, was genau ist der Bool? Ein Schlüsselwort vom Typ "Integral" oder ein Makro?

In C ++ heißt es Boolesches Literal , es ist ein eingebauter Typ.

§2.14.7

Typen bool , char, char16_t, char32_t, wchar_t und die Ganzzahlarten mit und ohne Vorzeichen werden gemeinsam als ganzzahlige Typen bezeichnet.

§2.14.6

Boolesche Literale

%Vor%

Die booleschen Literale sind die Schlüsselwörter false und true . Solche Literale sind Prvalues ​​und haben Typ bool.

§ 3.9.1.6

  

Werte vom Typ bool sind entweder wahr oder falsch. [Hinweis: Es gibt keine signierten, unsignierten, kurzen oder langen Zeichen   bool Arten oder Werte. - Endnote] Werte vom Typ bool nehmen an integrierten Promotions teil (4.5).

    
billz 04.08.2013 11:09
quelle
1

In C ++ bool ist ein eingebauter Datentyp. In C ist dies nicht der Fall. Wenn Sie also bool in C verwenden, wurde es als typedef oder mit #define implementiert, und true und false müssen mit #define implementiert sein oder sind Konstanten .

    
Codie CodeMonkey 04.08.2013 11:04
quelle
1

In C gibt es kein Konzept wie Boolesche Variablen, Ja Höhere Programmiersprachen wie Java, C # und andere bieten uns die Möglichkeit, eine boolesche Variable zu deklarieren, die wir für die Kennzeichnung verwenden, um sie entweder wahr oder falsch zu setzen.

Aber Sie können dies mithilfe von Integralen wie in C

implementieren %Vor%     
Đēēpak Shãrmã 04.08.2013 11:06
quelle
1

In C _Bool ist ein Typ und bool , true und false sind Makros, die in stdbool.h

definiert sind

ISO C11-Standardzustände (im Abschnitt 6.2.5 Typen )

  

Ein als Typ _Bool deklariertes Objekt ist groß genug, um die Werte 0 und 1 zu speichern.

stdbool.h definiert 4 Makros.

  1. bool , das zu _Bool erweitert wird
  2. true , das zu 1 erweitert wird
  3. false , das zu 0 erweitert wird
  4. __bool_true_false_are_defined , die auf 1 erweitert wird.
ShuklaSannidhya 04.08.2013 11:34
quelle

Tags und Links