Percebi que o código do kernel Linux usa bool, mas achei que o bool era do tipo C ++. Bool é uma extensão C padrão (por exemplo, ISO C90) ou uma extensão GCC?
c
gcc
linux-kernel
boolean
asussex
fonte
fonte
-std=gnu89
qual suporta_Bool
como uma extensão ao C90. "inclui / linux / types.h" possuitypedef _Bool bool;
.typedef _Bool bool;
(commit 6e21828743247270d09a86756a0c11702500dbfb ) e exigiu o GNU C 3.2 ou posterior.Respostas:
bool
existe no C - C99 atual, mas não no C89 / 90.Em C99, o tipo nativo é realmente chamado
_Bool
, enquantobool
é uma macro de biblioteca padrão definida emstdbool.h
(que é esperado que seja resolvida_Bool
). Objetos do tipo_Bool
mantêm 0 ou 1, whiletrue
efalse
também são macrosstdbool.h
.Observe, BTW, que isso implica que o pré-processador C interpretará
#if true
como a#if 0
menos questdbool.h
esteja incluído. Enquanto isso, o pré-processador C ++ é necessário para reconhecer nativamentetrue
como um literal de linguagem.fonte
_Bool
ocupa 1 bit de memória?_Bool
geralmente levam 1 byte de memória. No entanto, a especificação de linguagem permite explicitamente o uso_Bool
como tipo de campo de bits, o que significa que, usando campos de bits, você pode compactar um_Bool
valor em um único bit (dentro de uma estrutura maior)._Bool
valor pode ser endereçável diretamente (ou seja, tamanho de 1 byte) e também participar de um campo de bits? Uma matriz_Bool
ainda exigiria que todos os seus elementos fossem endereçáveis (por exemplo_Bool* ptr = &boolArray[123]
).O C99 adicionou um
_Bool
tipo de dados interno (consulte a Wikipedia para obter detalhes) e, se você#include <stdbool.h>
, ele fornecebool
como uma macro para_Bool
.Você perguntou sobre o kernel do Linux em particular. Ele assume a presença
_Bool
e fornece obool
próprio typedef em include / linux / types.h .fonte
Não, não existe
bool
na ISO C90.Aqui está uma lista de palavras-chave no padrão C (não 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
Aqui está um artigo discutindo algumas outras diferenças com o C usadas no kernel e no padrão: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html
fonte
O C99 possui no stdbool.h , mas no C90 deve ser definido como um typedef ou enum:
Alternativamente:
fonte
bool
e também do comportamento de muitosbit
tipos de compiladores . Por exemplo,bool x=4294967296LL;
oubool x=0.1;
definiriax
como um no C99, mas provavelmente definiria a maioria das versões de typedef para zero.fonte
typedef enum { false, true };
é tão bom. Se você insistir em ser mais explícito, pode escrevertypedef enum { false = 0, true = 1 };
. (Ou apenas#include <stdbool.h>
se o seu compilador suporta, tem sido padrão para 14 anos.)typedef enum { false, true } bool;
funciona exatamente como o esperado.1 == 0
e! false
não são elegantes, são apenas ofuscados. Não há decisão para o compilador tomar; deve obedecer à semântica definida pelo idioma.false
é definido como qualquer valor para o qual a linguagem diz que uma desigualdade deve ser avaliada etrue
seu "oposto" ( novamente, seja o que for). Dessa forma, não se deve importar se são {1, 0}, {-1, 0}, {0, 1} etc., e é garantido que funcione em comparações, porque foi criada usando uma.false
etrue
. Quem não conhece C não é o público esperado para o código C. E, como eu disse, C possui um tipo booleano incorporado desde o milênio anterior._Bool
é uma palavra-chave em C99: especifica um tipo, assim comoint
oudouble
.fonte
C99 define bool
true
efalse
instdbool.h
.fonte
stdbool.h foi introduzido em c99
fonte
stdbool.h
define macros true e false, mas lembre-se de que elas são definidas como 1 e 0.É por isso que
sizeof(true)
é 4.fonte
Não existe, provavelmente apenas uma macro para int
fonte
bool
tipo.O C99 adicionou um
bool
tipo cuja semântica é fundamentalmente diferente daquela de quase todos os tipos inteiros que existiam antes em C, incluindo tipos definidos pelo usuário e de extensão do compilador destinados a esses fins, e que alguns programas podem ter "tipos def" parabool
.Por exemplo, dado
bool a = 0.1, b=2, c=255, d=256;
, obool
tipo C99 definiria todos os quatro objetos como 1. Se um programa C89typedef unsigned char bool
fosse usado , os objetos receberiam 0, 1, 255 e 0, respectivamente. Se usadochar
, os valores podem ser os acima, ouc
pode ser -1. Se ele tivesse usado uma extensãobit
ou__bit
tipo de compilador , os resultados provavelmente seriam 0, 0, 1, 0 (tratando debit
maneira equivalente a um campo de bits não assinado do tamanho 1 ou um tipo inteiro não assinado com um bit de valor).fonte