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?
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.
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 .
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
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) { ... }
/* 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
est 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.
C99 définit bool, true
et false
dans stdbool.h
.
stdbool.h a été introduit dans c99
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.
Rien de tel, probablement juste une macro pour int
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).