Où est stdbool.h?
Je veux trouver la définition _Bool
sur mon système, donc pour les systèmes où il manque, je peux l'implémenter. J'ai vu diverses définitions ici et sur d'autres sites, mais je voulais vérifier le système pour la définition définitive.
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 pas le trouver.
Alors où est-il?
6 réponses
_Bool
est un type, donc ne vous attendez pas à trouver une définition dans un fichier d'en-tête, même un système de fichier d'en-tête.
Cela dit, en devinant votre système à partir des chemins que vous recherchez, avez-vous regardé dans /usr/lib/gcc/*/*/include
?
Mon "vrai" stdbool.h
y vit. Comme prévu, #define
s bool
doit être _Bool
. Comme _Bool
est un type natif du compilateur, il n'y a pas de définition dans le fichier d'en-tête.
Comme une note:
Le _Bool est défini en 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 _Bool
emplacement et trouver si C99 est déclaré... cependant, je ne suis pas satisfait de la déclaration faite par tout le monde.
Pourquoi Ne définissez-vous pas complètement le type?
typedef enum { false, true } bool;
_Bool
est un type prédéfini en C99, à l'instar de 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
- vérifiez que le compilateur est C99
- si c'est utiliser
_Bool
- sinon l'utilisation d'un autre type (
int
ouunsigned char
)
Par exemple:
#if defined __STDC__ && defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
/* have a C99 compiler */
typedef _Bool boolean;
#else
/* do not have a C99 compiler */
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 compilers 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 -x c -
$ echo $?
0
$ echo 'bool a;' | gcc -x c -c -
<stdin>:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘a’
Cela démontre que _Bool
est un type intégré et que bool
ne l'est pas, en compilant une seule déclaration de variable sans includes.