Est bool originaire de type C?
J'ai remarqué que le code du noyau de Linux utilise bool, mais je pensais que bool est un C++ type. Est booléen standard C extension (par exemple, ISO C90) ou un GCC extension?
- L'article 9 de la comp.lang.c FAQ parle de cela.
- Lien Direct: c-faq.com/bool/index.html
Vous devez vous connecter pour publier un commentaire.
bool
existe dans le courant C - C99, mais pas en C89/90.En C99 le type natif est en fait appelé
_Bool
, tandis quebool
est une bibliothèque standard macro définie dansstdbool.h
(qui évidemment se résout à_Bool
). Les objets de type_Bool
tenir soit à 0 ou 1, alors quetrue
etfalse
sont aussi des macros à partir destdbool.h
.Remarque, d'ailleurs, cela suppose que C le préprocesseur va interpréter
#if true
comme#if 0
saufstdbool.h
est inclus. Pendant ce temps, C++ préprocesseur est nécessaire pour nativement reconnaîtretrue
comme un langage littéral._Bool
prend 1 peu de mémoire?_Bool
prend généralement 1 octet de mémoire. Cependant, le langage de spécification permet explicitement à l'aide de_Bool
comme bits type de champ, ce qui signifie qu'en utilisant des bits de champs que vous pouvez presser_Bool
valeur dans un seul bit (au sein d'une grande structure (struct).C99 ajouté un builtin
_Bool
type de données (voir Wikipédia pour plus de détails), et si vous#include <stdbool.h>
, il fournitbool
comme une macro pour_Bool
.Vous avez demandé sur le noyau Linux en particulier. Il suppose la présence de
_Bool
et fournit unbool
typedef lui-même dans include/linux/types d'.h.Non, il n'y a pas de
bool
en ISO C90.Voici une liste des mots clés dans la norme C (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 de l'examen de certains autres différences avec C comme utilisé dans le noyau et la norme: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
C99 a dans stdbool.h, mais en C90 il doit être défini comme une définition de type ou enum:
Sinon:
bool
, et différente aussi de celle de nombreux compilateurs'bit
types. Par exemple,bool x=4294967296LL;
oubool x=0.1;
serait misx
à un sur C99, mais serait susceptible de définir la plupart des typedef versions à zéro.typedef enum { false, true };
est tout aussi bon. Si vous insistez sur le fait d'être plus explicite, vous pouvez écriretypedef enum { false = 0, true = 1 };
. (Ou tout simplement#include <stdbool.h>
si votre compilateur prend en charge; c'est la norme pour les 14 ans.)typedef enum { false, true } bool;
fonctionne exactement comme prévu.1 == 0
et! false
ne sont pas élégants, ils sont simplement occulté. Il n'y a pas de décision pour le compilateur de faire; il doit obéir à la sémantique définie par le langage.false
est réglé à la valeur quelle que soit la langue, dit une inégalité doit être évaluée, ettrue
à son "opposé" (encore une fois, quelle qu'elle soit). De cette manière, l'on devrait se soucient pas si c'est {1, 0}, { -1, 0}, {0, 1}, etc, et il est garanti pour fonctionner dans des comparaisons, parce que c'était fabriqué à l'aide de l'un.false
ettrue
. Ceux qui ne savent pas C est pas le public visé pour du code C. Et comme je l'ai dit, C a a un type Booléen depuis le dernier millénaire.#include <stdbool.h>
est la meilleure solution pour la décennie passée 🙂 je viens d'friands de ce très "langue agnostique" astuce pour le choix des valeurs._Bool
est un mot-clé dans C99: il spécifie un type, tout commeint
oudouble
.C99 définit bool,
true
etfalse
dansstdbool.h
.stdbool.h a été introduit en c99
stdbool.h
définit les macros le vrai et le faux, mais rappelez-vous, il a défini à 1 et 0.C'est pourquoi
sizeof(true)
est 4.Pas une telle chose, probablement juste une macro pour int
bool
type.C99 ajouté un
bool
type dont la sémantique sont fondamentalement différents de ceux d'à peu près tous les types d'entiers qui avaient existé avant dans C, y compris défini par l'utilisateur et par le compilateur types d'extension destinés à ces fins, et que certains des programmes de type "définition"ed àbool
.Par exemple, étant donné
bool a = 0.1, b=2, c=255, d=256;
, le C99bool
type de jeu tous les quatre objets de 1. Si un C89 programme utilisétypedef unsigned char bool
, les objets recevrait 0, 1, 255 et 0, respectivement. Si elle est utiliséechar
, les valeurs pourraient être comme ci-dessus, ouc
peut être -1. Si l'on avait utilisé un compilateur-extensionbit
ou__bit
type, les résultats seraient probablement 0, 0, 1, 0 (traitement debit
d'une manière équivalente à un unsigned bits de taille 1, ou d'un type entier non signé, avec une valeur de bit).