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?

22
demandé sur James Morris 2009-11-01 13:59:56

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.

13
répondu CB Bailey 2009-11-01 11:06:33

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à.

7
répondu pbos 2009-11-01 11:42:59

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;
4
répondu Adrien Plisson 2017-03-14 15:55:50

_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 ou unsigned 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
2
répondu pmg 2009-11-01 20:56:45

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_ */
1
répondu Yaping Xin 2014-02-09 16:33:21
$ 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.

0
répondu Matt Joiner 2009-11-02 10:15:05