Je veux trouver la définition de _Bool
sur mon système, donc pour les systèmes où il manque, je peux l’implémenter. J’ai vu différentes définitions pour cela ici et sur d’autres sites, mais je voulais vérifier la définition définitive du système.
Léger problème, en ce sens que je ne trouve pas où _Bool est défini ou même stdbool.h
mussys@debmus:~$ find /usr/include/* -name stdbool.h /usr/include/c++/4.3/tr1/stdbool.h
Et grep
pour _Bool
sur /usr/include/*
et /usr/include/*/*
ne le trouve pas non plus.
Alors où est-ce?
_Bool
est un type intégré, alors ne vous attendez pas à en trouver une définition dans un fichier d’en-tête, même un fichier d’en-tête système.
Cela dit, devinant votre système à partir des chemins que vous recherchez, avez-vous consulté /usr/lib/gcc/*/*/include
?
Mon “vrai” stdbool.h
vit là-bas. Comme prévu, #define
s bool
pour être _Bool
. Comme _Bool
est un type natif au compilateur, il n’ya aucune définition dans le fichier d’en-tête.
Comme une note:
Le _Bool est défini dans C99. Si vous construisez votre programme avec:
gcc -std=c99
Vous pouvez vous attendre à ce qu’il soit là.
D’autres personnes ont répondu à la question sur la localisation de _Bool
et trouvé si C99 est déclaré … mais je ne suis pas satisfait de la déclaration faite par moi-même, tout le monde a donné.
Pourquoi ne définissez-vous pas complètement le type?
typedef enum { false, true } bool;
_Bool
est un type prédéfini dans C99, un peu comme int
ou double
. Vous ne trouverez pas non plus la définition de int
dans un fichier d’en-tête.
Ce que vous pouvez faire est
_Bool
int
ou unsigned char
) Par exemple:
#if defined __STDC__ && defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L /* have a C99 comstackr */ typedef _Bool boolean; #else /* do not have a C99 comstackr */ typedef unsigned char boolean; #endif
certains compilateurs n’offrent pas de mots clés _Bool, donc j’ai écrit mon propre stdbool.h:
#ifndef STDBOOL_H_ #define STDBOOL_H_ /** * stdbool.h * Author - Yaping Xin * E-mail - xinyp at live dot com * Date - February 10, 2014 * Copyright - You are free to use for any purpose except illegal acts * Warrenty - None: don't blame me if it breaks something * * In ISO C99, stdbool.h is a standard header and _Bool is a keyword, but * some comstackrs don't offer these yet. This header file is an * implementation of the stdbool.h header file. * */ #ifndef _Bool typedef unsigned char _Bool; #endif /* _Bool */ /** * Define the Boolean macros only if they are not already defined. */ #ifndef __bool_true_false_are_defined #define bool _Bool #define false 0 #define true 1 #define __bool_true_false_are_defined 1 #endif /* __bool_true_false_are_defined */ #endif /* STDBOOL_H_ */
$ echo '_Bool a;' | gcc -c -xc - $ echo $? 0 $ echo 'bool a;' | gcc -xc -c - :1: error: expected '=', ',', ';', 'asm' or '__atsortingbute__' before 'a'
Cela démontre que _Bool
est un type intégré et que bool
ne l’est pas, en compilant une déclaration de variable unique sans inclusion.