Domanda

Ho notato che il codice del kernel Linux usa bool, ma ho pensato che bool fosse di tipo C ++. Bool è un'estensione C standard (ad es. ISO C90) o un'estensione GCC?

È stato utile?

Soluzione

bool esiste nell'attuale C - C99, ma non in C89 / 90.

In C99 il tipo nativo è in realtà chiamato _Bool, mentre stdbool.h è una macro di libreria standard definita in true (che si prevede che si risolva in false). Gli oggetti di tipo #if true contengono 0 o 1, mentre #if 0 e <=> sono anche macro da <=>.

Nota, a proposito, ciò implica che il preprocessore C interpreterà <=> come <=> a meno che non sia incluso <=>. Nel frattempo, è necessario il preprocessore C ++ per riconoscere nativamente <=> come linguaggio letterale.

Altri suggerimenti

C99 ha aggiunto un tipo di dati _Bool incorporato (vedi Wikipedia per dettagli), e se #include <stdbool.h>, fornisce bool come macro a <=>.

Hai chiesto informazioni sul kernel Linux in particolare. Presuppone la presenza di <=> e fornisce un <=> typedef stesso in include / linux / types.h .

No, non esiste bool in ISO C90.

Ecco un elenco di parole chiave nella norma C (non 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

Ecco un articolo che discute alcune altre differenze con C come usato nel kernel e nello standard: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html

C99 ce l'ha in stdbool.h , ma in C90 deve essere definito come typedef o enum:

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

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

In 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 è una parola chiave in C99: specifica un tipo, proprio come int o double.

  

6.5.2

     

2 Un oggetto dichiarato come tipo _Bool   è abbastanza grande per memorizzare i valori 0   e 1.

C99 definisce bool, true e false in stdbool.h.

stdbool.h è stato introdotto in c99

stdbool.h definisce le macro vero e falso, ma ricorda che è definito come 1 e 0.

Ecco perché sizeof(true) è 4.

Nessuna di queste cose, probabilmente solo una macro per int

C99 ha aggiunto un tipo bool la cui semantica è sostanzialmente diversa da quella di quasi tutti i tipi di numeri interi che erano esistiti in precedenza in C, inclusi i tipi di estensione del compilatore e definiti dall'utente destinati a tali scopi e che alcuni programmi potrebbero avere " type-def " ed a bool a = 0.1, b=2, c=255, d=256;.

Ad esempio, dato typedef unsigned char bool, il tipo C99 char imposterebbe tutti e quattro gli oggetti su 1. Se un programma C89 usasse c, gli oggetti riceveranno rispettivamente 0, 1, 255 e 0. Se utilizzava bit, i valori potrebbero essere come sopra o __bit potrebbe essere -1. Se avesse utilizzato un tipo di estensione <=> o <=> del compilatore, i risultati sarebbero probabilmente 0, 0, 1, 0 (trattando <=> in modo equivalente a un campo bit senza segno di dimensioni 1 o un tipo intero senza segno con un bit di valore).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top