Pregunta

Me di cuenta de que el código del kernel de Linux usa bool, pero pensé que bool era del tipo C++.¿Bool es una extensión C estándar (por ejemplo, ISO C90) o una extensión GCC?

¿Fue útil?

Solución

bool existe en el actual C - C99, pero no en el C89/90.

En C99 el tipo nativo en realidad se llama _Bool, mientras bool es una macro de biblioteca estándar definida en stdbool.h (que se espera que se resuelva a _Bool).Objetos de tipo _Bool mantenga presionado 0 o 1, mientras true y false también son macros de stdbool.h.

Tenga en cuenta, por cierto, que esto implica que el preprocesador de C interpretará #if true como #if 0 a menos que stdbool.h está incluido.Mientras tanto, se requiere un preprocesador C++ para reconocer de forma nativa true como lenguaje literal.

Otros consejos

C99 agregó un incorporado _Bool tipo de datos (ver Wikipedia para más detalles), y si usted #include <stdbool.h>, proporciona bool como una macro para _Bool.

Preguntaste sobre el kernel de Linux en particular.Se supone la presencia de _Bool y proporciona un bool typedef mismo en incluir/linux/types.h.

No, no hay bool en ISO C90.

Aquí hay una lista de palabras clave en el estándar C (no C99):

  • auto
  • break
  • case
  • char
  • const
  • continue
  • default
  • do
  • double
  • else
  • enum
  • extern
  • float
  • for
  • goto
  • if
  • int
  • long
  • register
  • return
  • short
  • signed
  • static
  • struct
  • switch
  • typedef
  • union
  • unsigned
  • void
  • volatile
  • while

Aquí hay un artículo que discute algunas otras diferencias con C como se usa en el núcleo y el estándar: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html

C99 lo tiene en stdbool.h , pero en C90 debe definirse como typedef o enum:

typedef int bool;
#define TRUE  1
#define FALSE 0

bool f = FALSE;
if (f) { ... }

Alternativamente:

typedef enum { FALSE, TRUE } boolean;

boolean b = FALSE;
if (b) { ... }
/* Many years ago, when the earth was still cooling, we used this: */

typedef enum
{
    false = ( 1 == 0 ),
    true = ( ! false )
} bool;

/* It has always worked for me. */

_Bool es una palabra clave en C99: especifica un tipo, como int o double.

  

6.5.2

     

2 Un objeto declarado como tipo _Bool   es lo suficientemente grande como para almacenar los valores 0   y 1.

C99 define bool, true y false en stdbool.h.

stdbool.h se introdujo en c99

stdbool.h define las macros verdadero y falso, pero recuerde que está definido como 1 y 0.

Por eso sizeof(true) es 4.

No existe tal cosa, probablemente solo una macro para int

C99 agregó un tipo bool cuya semántica es fundamentalmente diferente de la de casi todos los tipos enteros que habían existido anteriormente en C, incluidos los tipos de extensión de compilador y definidos por el usuario destinados a tales fines, y que algunos programas pueden tener " type-def " ed to bool a = 0.1, b=2, c=255, d=256;.

Por ejemplo, dado typedef unsigned char bool, el tipo C99 char establecería los cuatro objetos en 1. Si un programa C89 usara c, los objetos recibirían 0, 1, 255 y 0, respectivamente. Si usaba bit, los valores podrían ser como los anteriores, o __bit podría ser -1. Si hubiera usado un tipo de compilación-extensión <=> o <=>, los resultados probablemente serían 0, 0, 1, 0 (tratando <=> de manera equivalente a un campo de bits sin signo de tamaño 1, o un tipo entero sin signo con un bit de valor).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top