web-dev-qa-db-fra.com

Est-ce que bool est un type C natif?

J'ai remarqué que le code du noyau Linux utilise bool, mais je pensais que bool était un type C++. Bool est-il une extension C standard (par exemple, ISO C90) ou une extension GCC?

234
asussex

bool existe dans le C - C99 actuel, mais pas dans le C89/90.

En C99, le type natif est en fait appelé _Bool, alors que bool est une macro de bibliothèque standard définie dans stdbool.h (qui doit normalement être _Bool). Les objets de type _Bool contiennent 0 ou 1, alors que true et false sont également des macros de stdbool.h.

Notez, BTW, que cela implique que le préprocesseur C interprétera #if true comme #if 0 à moins que stdbool.h soit inclus. Pendant ce temps, le préprocesseur C++ est requis pour reconnaître nativement true en tant que littéral de langage.

327
AnT

C99 a ajouté un type de données _Bool intégré (voir Wikipedia pour plus de détails) et si vous #include <stdbool.h>, il fournit bool sous forme de macro à _Bool.

Vous avez posé une question sur le noyau Linux en particulier. Il suppose la présence de _Bool et fournit un bool typedef lui-même dans include/linux/types.h .

115
Josh Kelley

Non, il n'y a pas bool dans ISO C90.

Voici une liste de mots-clés en C standard (pas 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

Voici un article décrivant certaines autres différences avec C utilisées dans le noyau et dans la norme: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html

32
BobbyShaftoe

C99 l’a dans stdbool.h , mais en C90, il doit être défini comme un typedef ou enum:

typedef int bool;
#define TRUE  1
#define FALSE 0

bool f = FALSE;
if (f) { ... }

Alternativement:

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

_Boolest un mot clé dans C99: il spécifie un type, tout comme int ou double.

6.5.2

2 Un objet déclaré comme type _Bool est assez grand pour stocker les valeurs 0 et 1.

11
pmg

C99 définit bool, true et false dans stdbool.h.

6
starblue

stdbool.h a été introduit dans c99

2
Nick Van Brunt

stdbool.h définit les macros true et false, mais rappelez-vous qu'il a été défini comme étant 1 et 0. 

C'est pourquoi sizeof(true) est 4.

1
Neha Gangwar

Rien de tel, probablement juste une macro pour int

0
sindre j

C99 a ajouté un type bool dont la sémantique est fondamentalement différente de celle de presque tous les types entiers qui existaient auparavant en C, y compris les types définis par l'utilisateur et les extensions de compilateur destinés à ces fins, et dont certains programmes peuvent avoir "type-def" ed to bool.

Par exemple, étant donné bool a = 0.1, b=2, c=255, d=256;, le type C99 bool définirait les quatre objets sur 1. Si un programme C89 utilisait typedef unsigned char bool, les objets recevraient respectivement 0, 1, 255 et 0. Si elle utilisait char, les valeurs pourraient être les mêmes que ci-dessus, ou c pourrait être -1. Si elle avait utilisé un type bit ou __bit du type compilateur-extension, les résultats seraient vraisemblablement 0, 0, 1, 0 (traiter bit de manière équivalente à un champ de bits non signé de taille 1, ou un type entier non signé avec une valeur bit).

0
supercat