Me di cuenta de que el código del kernel de Linux usa bool, pero pensé que bool era un tipo C ++. ¿Bool es una extensión C estándar (por ejemplo, ISO C90) o una extensión GCC?
c
gcc
linux-kernel
boolean
asussex
fuente
fuente
-std=gnu89
que admite_Bool
como una extensión de C90. "include / linux / types.h" tienetypedef _Bool bool;
.typedef _Bool bool;
(commit 6e21828743247270d09a86756a0c11702500dbfb ) y requería GNU C 3.2 o posterior.Respuestas:
bool
existe en el C - C99 actual, pero no en C89 / 90.En C99, el tipo nativo se llama realmente
_Bool
, mientras quebool
es una macro de biblioteca estándar definida enstdbool.h
(que se espera que se resuelva_Bool
). Objetos de tipo_Bool
de retención 0 o 1, mientras quetrue
yfalse
son también las macros destdbool.h
.Tenga en cuenta, por cierto, que esto implica que el preprocesador C interpretará
#if true
como a#if 0
menos questdbool.h
esté incluido. Mientras tanto, se requiere el preprocesador de C ++ para reconocer de forma nativatrue
como un lenguaje literal.fuente
_Bool
ocupa 1 bit de memoria?_Bool
generalmente requieren 1 byte de memoria. Sin embargo, la especificación del lenguaje permite explícitamente el uso_Bool
como tipo de campo de bits, lo que significa que al usar campos de bits puede exprimir un_Bool
valor en un solo bit (dentro de una estructura más grande)._Bool
valor ser directamente direccionable (es decir, de tamaño 1 byte) y también participar en un campo de bits? Una matriz de_Bool
todavía requeriría que todos sus elementos sean direccionables (por ejemplo_Bool* ptr = &boolArray[123]
).C99 agregó un
_Bool
tipo de datos incorporado (consulte Wikipedia para más detalles), y si lo hace#include <stdbool.h>
, se proporcionabool
como una macro para_Bool
.Preguntaste sobre el kernel de Linux en particular. Asume la presencia de
_Bool
y proporciona unbool
typedef en sí mismo en include / linux / types.h .fuente
No, no existe
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
fuente
C99 lo tiene en stdbool.h , pero en C90 debe definirse como typedef o enum:
Alternativamente:
fuente
bool
, y también diferente al de muchosbit
tipos de compiladores . Por ejemplo,bool x=4294967296LL;
obool x=0.1;
se estableceríax
en uno en C99, pero probablemente establecería la mayoría de las versiones typedef en cero.fuente
typedef enum { false, true };
es igual de bueno Si insiste en ser más explícito, puede escribirtypedef enum { false = 0, true = 1 };
. (O simplemente#include <stdbool.h>
si su compilador lo admite; ha sido estándar durante 14 años.)typedef enum { false, true } bool;
funciona exactamente como se esperaba.1 == 0
y! false
no son elegantes, simplemente están ofuscados. No hay una decisión que tome el compilador; debe obedecer la semántica definida por el lenguaje.false
se establece en cualquier valor que el lenguaje dice que se debe evaluar una desigualdad, ytrue
en su "opuesto" ( de nuevo, sea lo que sea). De esta manera, no debería importarnos si eso es {1, 0}, {-1, 0}, {0, 1}, etc., y se garantiza que funcionará en las comparaciones, ya que se creó utilizando uno.false
ytrue
. Cualquiera que no conozca C no es la audiencia esperada para el código C. Y como dije, C ha tenido un tipo booleano incorporado desde el milenio anterior._Bool
es una palabra clave en C99: especifica un tipo, al igual queint
odouble
.fuente
C99 define bool,
true
yfalse
enstdbool.h
.fuente
stdbool.h se introdujo en c99
fuente
stdbool.h
define macros verdadero y falso, pero recuerde que se define como 1 y 0.Por eso
sizeof(true)
es 4.fuente
No existe tal cosa, probablemente solo una macro para int
fuente
bool
tipo.C99 agregó un
bool
tipo cuya semántica es fundamentalmente diferente de la de casi todos los tipos enteros que existieron anteriormente en C, incluidos los tipos definidos por el usuario y la extensión del compilador destinados a tales fines, y que algunos programas pueden tener "type-def" ed abool
.Por ejemplo, dado
bool a = 0.1, b=2, c=255, d=256;
, elbool
tipo C99 establecería los cuatro objetos en 1. Si se usara un programa C89typedef unsigned char bool
, los objetos recibirían 0, 1, 255 y 0, respectivamente. Si se usachar
, los valores pueden ser como se indica arriba oc
-1. Si hubiera utilizado una extensiónbit
o__bit
tipo de compilador , los resultados probablemente serían 0, 0, 1, 0 (tratandobit
de forma equivalente a un campo de bits sin signo de tamaño 1, o un tipo entero sin signo con un bit de valor).fuente