Bool è un tipo C nativo?
-
05-07-2019 - |
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?
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).