¿Bool es un tipo C nativo?
-
05-07-2019 - |
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?
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).