Pergunta

Eu tenho notado que o Linux kernel usa código bool, mas eu pensei que bool era um tipo C ++. É booleano uma extensão C padrão (por exemplo, a ISO C90) ou uma extensão GCC?

Foi útil?

Solução

bool existe no actual C - C99, mas não em C89 / 90

.

Em C99 o tipo nativo é realmente chamado _Bool, enquanto bool é uma macro biblioteca padrão definido no stdbool.h (que resolve Expectedly para _Bool). Objetos do tipo _Bool espera 0 ou 1, enquanto true e false também são macros de stdbool.h.

Note, BTW, que isto implica que C pré-processador irá interpretar #if true como #if 0 menos stdbool.h está incluído. Enquanto isso, pré-processador C ++ é necessário para nativamente reconhecer true como um literal da linguagem.

Outras dicas

C99 acrescentou um tipo de dados embutido _Bool (ver Wikipedia para detalhes), e se você #include <stdbool.h>, ele fornece bool como uma macro na _Bool.

Você perguntou sobre o kernel Linux em particular. Assume-se a presença de _Bool e fornece um bool typedef-se em include / linux / types.h .

Não, não há nenhuma bool em ISO C90.

Aqui está uma lista de palavras-chave em C padrão (não 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 que discute alguns outros diferenças com C, usado no kernel eo padrão: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html

C99 tem em stdbool.h , mas em C90 deve ser definido como um typedef:

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

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

Como alternativa:

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 é uma palavra-chave no C99:. Especifica um tipo, assim como int ou double

6.5.2

2 Um objeto declarado como tipo _Bool é grande o suficiente para armazenar os valores 0 e 1.

C99 define bool, true e false em stdbool.h.

stdbool.h foi introduzido em c99

Define stdbool.h macros verdadeiro e falso, mas lembre-se definida para ser 1 e 0.

É por isso que sizeof(true) é 4.

Não há tal coisa, provavelmente apenas uma macro para int

C99 adicionado um tipo bool cuja semântica são fundamentalmente diferentes dos de praticamente todos os tipos inteiros que já existiam antes em C, incluindo tipos definidos pelo usuário e compilador de extensão destinados a esses fins, e que alguns programas podem ter "tipo -def "ed para bool.

Por exemplo, dado bool a = 0.1, b=2, c=255, d=256;, o tipo bool C99 iria definir todos os quatro objetos a 1. Se um programa C89 usado typedef unsigned char bool, os objetos receberia 0, 1, 255, e 0, respectivamente. Se ele é utilizado char, os valores podem ser como acima, ou pode ser c -1. Se fosse utilizado um bit compilador-extensão ou tipo __bit, os resultados provavelmente ser 0, 0, 1, 0 (tratamento de bit de uma forma equivalente à de um campo de bits sem sinal de tamanho 1, ou um tipo inteiro sem sinal com um valor bit).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top