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?
c
gcc
linux-kernel
boolean
asussex
la source
la source
-std=gnu89
ce qui prend_Bool
en charge comme une extension de C90. "include / linux / types.h" atypedef _Bool bool;
.typedef _Bool bool;
(commit 6e21828743247270d09a86756a0c11702500dbfb ) et il nécessitait GNU C 3.2 ou une version ultérieure.Réponses:
bool
existe dans le C - C99 actuel, mais pas dans le C89 / 90.En C99, le type natif est en fait appelé
_Bool
, tandisbool
qu'une macro de bibliothèque standard est définie dansstdbool.h
(qui se résout normalement_Bool
). Les objets de type_Bool
contiennent 0 ou 1, tandis quetrue
etfalse
sont également des macros destdbool.h
.Notez, BTW, que cela implique que le préprocesseur C interprétera
#if true
comme#if 0
sauf s'ilstdbool.h
est inclus. Pendant ce temps, le préprocesseur C ++ est nécessaire pour reconnaître nativementtrue
comme un littéral de langage.la source
_Bool
prend 1 bit de mémoire?_Bool
prennent généralement 1 octet de mémoire. Cependant, la spécification du langage autorise explicitement l'utilisation_Bool
comme type de champ de bits, ce qui signifie qu'en utilisant des champs de bits, vous pouvez compresser une_Bool
valeur en un seul bit (à l'intérieur d'une structure plus grande)._Bool
valeur peut-elle être à la fois directement adressable (c'est-à-dire de taille 1 octet) et également participer à un champ binaire? Un tableau de_Bool
nécessiterait toujours que tous ses éléments soient adressables (par exemple_Bool* ptr = &boolArray[123]
).C99 a ajouté un
_Bool
type de données intégré (voir Wikipedia pour plus de détails), et si vous#include <stdbool.h>
, il fournitbool
une macro à_Bool
.Vous avez posé des questions sur le noyau Linux en particulier. Il suppose la présence de
_Bool
et fournit unbool
typedef lui-même dans include / linux / types.h .la source
Non, il n'y
bool
en a pas 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 discutant d' autres différences avec C telles qu'utilisées dans le noyau et la norme: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
la source
C99 l'a dans stdbool.h , mais dans C90 il doit être défini comme typedef ou enum:
Alternativement:
la source
bool
, et également différent de celui de nombreuxbit
types de compilateurs . Par exemple,bool x=4294967296LL;
oubool x=0.1;
définiraitx
un sur C99, mais mettrait probablement la plupart des versions typedef à zéro.la source
typedef enum { false, true };
est tout aussi bon. Si vous insistez pour être plus explicite, vous pouvez écriretypedef enum { false = 0, true = 1 };
. (Ou tout simplement#include <stdbool.h>
si votre compilateur le prend en charge; il est standard depuis 14 ans.)typedef enum { false, true } bool;
fonctionne exactement comme prévu.1 == 0
et! false
ne sont pas élégants, ils sont simplement obscurcis. Il n'y a aucune décision à prendre par le compilateur; il doit obéir à la sémantique définie par le langage.false
est réglé sur la valeur que le langage dit qu'une inégalité devrait être évaluée ettrue
sur son "opposé" ( encore une fois, quoi que ce soit). De cette façon, il ne faut pas se soucier si c'est {1, 0}, {-1, 0}, {0, 1}, etc., et il est garanti de fonctionner dans les comparaisons, car il a été conçu en utilisant un.false
ettrue
. Quiconque ne connaît pas C n'est pas le public attendu pour le code C. Et comme je l'ai dit, C a un type booléen intégré depuis le millénaire précédent._Bool
est un mot-clé en C99: il spécifie un type, tout commeint
oudouble
.la source
C99 définit bool
true
etfalse
instdbool.h
.la source
stdbool.h a été introduit en c99
la source
stdbool.h
définit les macros vrai et faux, mais rappelez-vous qu'il a été défini comme étant 1 et 0.C'est pourquoi
sizeof(true)
est 4.la source
Pas une telle chose, probablement juste une macro pour int
la source
bool
genre.C99 a ajouté un
bool
type dont la sémantique est fondamentalement différente de celles de presque tous les types entiers qui existaient auparavant en C, y compris les types définis par l'utilisateur et d'extension de compilateur destinés à de telles fins, et que certains programmes peuvent avoir "type-def" ed àbool
.Par exemple, étant donné que
bool a = 0.1, b=2, c=255, d=256;
lebool
type C99 définirait les quatre objets sur 1. Si un programme C89 était utilisétypedef unsigned char bool
, les objets recevraient respectivement 0, 1, 255 et 0. S'il est utiliséchar
, les valeurs peuvent être les mêmes que ci-dessus ouc
-1. S'il avait utilisé une extensionbit
ou un__bit
type de compilateur , les résultats seraient probablement 0, 0, 1, 0 (en traitantbit
d'une manière équivalente à un champ de bits non signé de taille 1 ou à un type entier non signé avec un bit de valeur).la source