Où est stdbool.h?

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

  • vérifiez que le compilateur est C99
  • s’il est utilisé _Bool
  • sinon, utilisez un autre type ( 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.