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=gnu89que admite_Boolcomo 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:
boolexiste en el C - C99 actual, pero no en C89 / 90.En C99, el tipo nativo se llama realmente
_Bool, mientras quebooles una macro de biblioteca estándar definida enstdbool.h(que se espera que se resuelva_Bool). Objetos de tipo_Boolde retención 0 o 1, mientras quetrueyfalseson también las macros destdbool.h.Tenga en cuenta, por cierto, que esto implica que el preprocesador C interpretará
#if truecomo a#if 0menos questdbool.hesté incluido. Mientras tanto, se requiere el preprocesador de C ++ para reconocer de forma nativatruecomo un lenguaje literal.fuente
_Boolocupa 1 bit de memoria?_Boolgeneralmente requieren 1 byte de memoria. Sin embargo, la especificación del lenguaje permite explícitamente el uso_Boolcomo tipo de campo de bits, lo que significa que al usar campos de bits puede exprimir un_Boolvalor en un solo bit (dentro de una estructura más grande)._Boolvalor ser directamente direccionable (es decir, de tamaño 1 byte) y también participar en un campo de bits? Una matriz de_Booltodavía requeriría que todos sus elementos sean direccionables (por ejemplo_Bool* ptr = &boolArray[123]).C99 agregó un
_Booltipo de datos incorporado (consulte Wikipedia para más detalles), y si lo hace#include <stdbool.h>, se proporcionaboolcomo una macro para_Bool.Preguntaste sobre el kernel de Linux en particular. Asume la presencia de
_Booly proporciona unbooltypedef en sí mismo en include / linux / types.h .fuente
No, no existe
boolen ISO C90.Aquí hay una lista de palabras clave en el estándar C (no C99):
autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedstaticstructswitchtypedefunionunsignedvoidvolatilewhileAquí 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 muchosbittipos de compiladores . Por ejemplo,bool x=4294967296LL;obool x=0.1;se estableceríaxen 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 == 0y! falseno son elegantes, simplemente están ofuscados. No hay una decisión que tome el compilador; debe obedecer la semántica definida por el lenguaje.falsese establece en cualquier valor que el lenguaje dice que se debe evaluar una desigualdad, ytrueen 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.falseytrue. 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._Booles una palabra clave en C99: especifica un tipo, al igual queintodouble.fuente
C99 define bool,
trueyfalseenstdbool.h.fuente
stdbool.h se introdujo en c99
fuente
stdbool.hdefine 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
booltipo.C99 agregó un
booltipo 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;, elbooltipo 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ónbito__bittipo de compilador , los resultados probablemente serían 0, 0, 1, 0 (tratandobitde 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