Est-ce que bool est un type C natif?
-
05-07-2019 - |
Question
J'ai remarqué que le code du noyau Linux utilise bool, mais je pensais que bool était de type C ++. Bool est-il une extension C standard (par exemple, ISO C90) ou une extension GCC?
La solution
bool
existe dans le C - C99 actuel, mais pas dans le C89 / 90.
Dans C99, le type natif est en fait appelé _Bool
, tandis que stdbool.h
est une macro de bibliothèque standard définie dans true
(qui doit normalement être résolue en false
). Les objets de type #if true
contiennent 0 ou 1, tandis que #if 0
et <=> sont également des macros de <=>.
Notez, BTW, que cela implique que le préprocesseur interprétera <=> comme <=> sauf si <=> est inclus. En attendant, le préprocesseur C ++ est requis pour reconnaître de manière native <=> en tant que littéral de langage.
Autres conseils
C99 a ajouté un type de données intégré (voir Wikipedia pour plus de détails), et si vous _Bool
, il fournit #include <stdbool.h>
une macro à bool
.
Vous avez posé une question sur le noyau Linux en particulier. Il assume la présence de <=> et fournit un <=> type 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 traitant de autres différences avec C, telles qu'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 dans 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 vrai et faux, mais rappelez-vous qu'il est défini comme étant 1 et 0.
C’est pourquoi sizeof(true)
vaut 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-compilateur destinés à cet usage, et que certains programmes peuvent avoir. " type-def " ed to bool a = 0.1, b=2, c=255, d=256;
.
Par exemple, étant donné typedef unsigned char bool
, le type C99 char
définirait les quatre objets sur 1. Si un programme C89 utilisait c
, les objets recevraient respectivement 0, 1, 255 et 0. S'il a utilisé bit
, les valeurs peuvent être les mêmes que ci-dessus ou __bit
peut être -1. S'il avait utilisé un type <=> ou <=> de compilateur-extension, les résultats seraient vraisemblablement 0, 0, 1, 0 (traiter <=> d'une manière équivalente à un champ non signé de taille 1, ou type entier non signé avec un bit de valeur).