2009-11-01 16 views
21

Quiero encontrar la definición _Bool en mi sistema, por lo que para los sistemas en los que falta, puedo implementarlo. He visto varias definiciones aquí y en otros sitios, pero quería verificar en el sistema la definición definitiva.¿Dónde está stdbool.h?

pequeño problema, ya que no puedo encontrar donde se define _Bool o incluso stdbool.h

[email protected]:~$ find /usr/include/* -name stdbool.h 
/usr/include/c++/4.3/tr1/stdbool.h 

Y grep para _Bool en /usr/include/* y /usr/include/*/* concluye que no es tampoco.

Entonces, ¿dónde está?

Respuesta

12

_Bool es un tipo incorporado, así que no espere encontrar una definición para que en un archivo de cabecera, incluso un archivo de cabecera del sistema.

Habiendo dicho eso, adivinando su sistema desde las rutas que está buscando, ¿ha buscado en /usr/lib/gcc/*/*/include?

Mi "real" stdbool.h vive allí. Como se esperaba, #define s bool es _Bool. Como _Bool es un tipo nativo del compilador, no hay definición para él en el archivo de encabezado.

+0

Gracias. No, no había marcado allí, pero mi sistema es el mismo, sí. –

0
$ 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’ 

Esto demuestra que _Bool es un tipo incorporado y bool no es, mediante la compilación de una sola declaración de variables sin incluye.

+0

'$ echo '_Bool a;' | gcc -std = c99 -x c -c -' ... '$ echo $?' ... '0' ... Ya veo. –

+0

tal vez ahora tenga sentido, lo expliqué un poco. –

7

Como nota:

El _Bool se define en C99. Si construye su programa con:

gcc -std=c99 

Puede esperar que esté allí.

+0

Gracias, pero esto no es lo que estaba preguntando. –

+0

Creo que esa funcionalidad no se puede definir en un encabezado c. Todos los tipos que existen envuelven, y si comparas un (sin signo char) bool (= 2) con otro bool (= 3), no coincidirían. ¡Así que es verdad! = Verdadero, y eso apestaría. También bool b1 == true también podría fallar. Como ningún tipo de datos (excepto \ Bool) tiene este comportamiento, probablemente no puedas hacer uno tú mismo, ya que requiere compatibilidad con el back-end del compilador, y no puedes sobrecargar a los operadores. Podrías hacer cmp_bool (bool b, bool b2), pero probablemente sea * realmente * no lo que querías. No puedo garantizar que tengo razón, pero espero que haya agregado algo al menos. :) – pbos

+0

Eso es "subrayar Bool", el formato se eliminó, y el guión bajo de la barra invertida no ayudó. – pbos

2

_Bool es un tipo predefinido en C99, muy similar a int o double. Tampoco encontrará la definición de int en ningún archivo de encabezado.

Lo que puede hacer es

  • cheque el compilador es C99
  • si se trata de utilizar _Bool
  • utilizan de alguna manera algún otro tipo (int o unsigned char)

Por ejemplo:

#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 
+0

Estoy usando autotools que me dice acerca de '_Bool' a través de' HAVE__BOOL' y 'HAVE_STD_BOOL_H' pero de esta manera parece una alternativa justa. –

+0

Una versión más corta sería "#ifndef _Bool", ¿hay alguna forma no estándar de escribir eso? Sé que funciona en gcc. – pbos

+2

No esperaba '#ifndef _Bool' para funcionar, y tampoco lo hace con el gcc (4.3.2 debian) que estoy usando. –

4

Otras personas han respondido a la pregunta en la ubicación _Bool y han encontrado si se ha declarado C99 ... sin embargo, no estoy satisfecho con la declaración que todos hicieron.

¿Por qué no se define completamente el tipo?

typedef enum { false, true } bool; 
+0

Creo que es excesivo después de que decidí googlear "bool enum c" que me envió a http://www.lysator.liu.se/c/c-faq/c-8.html - ver la parte inferior de la página con respecto al peligro de #defining true to be 1 · –

+0

Estoy de acuerdo con los argumentos provistos en su enlace. Personalmente, defino verdadero y falso para mayor claridad al asignar a una variable booleana. viniendo de un fondo fuertemente tipado, para mí, un bool no es un char ni un int, es un tipo en sí mismo, por lo tanto, la definición de enum anterior. Además, creo que la conversión automática de int a bool no es una buena idea (y esto se aplica a cualquier conversión automática). –

+1

¿Qué sucede si el encabezado se incluye desde un archivo fuente de C++? Es mejor no usar las palabras clave "bool", "true" y "false" al definir el tipo. –

1

algunos compiladores no ofrecen las palabras clave _Bool, así que escribí mi propia 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_ */