Question

J'ai remarqué que le code du noyau Linux utilise bool, mais je pensais que bool était de type C ++. Bool est-il une extension C standard (par exemple, ISO C90) ou une extension GCC?

Était-ce utile?

La solution

bool existe dans le C - C99 actuel, mais pas dans le C89 / 90.

Dans C99, le type natif est en fait appelé _Bool, tandis que stdbool.h est une macro de bibliothèque standard définie dans true (qui doit normalement être résolue en false). Les objets de type #if true contiennent 0 ou 1, tandis que #if 0 et <=> sont également des macros de <=>.

Notez, BTW, que cela implique que le préprocesseur interprétera <=> comme <=> sauf si <=> est inclus. En attendant, le préprocesseur C ++ est requis pour reconnaître de manière native <=> en tant que littéral de langage.

Autres conseils

C99 a ajouté un type de données intégré (voir Wikipedia pour plus de détails), et si vous _Bool, il fournit #include <stdbool.h> une macro à bool.

Vous avez posé une question sur le noyau Linux en particulier. Il assume la présence de <=> et fournit un <=> type lui-même dans include / linux / types.h .

Non, il n'y a pas bool dans ISO C90.

Voici une liste de mots-clés en C standard (pas 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

Voici un article traitant de autres différences avec C, telles qu'utilisées dans le noyau et dans la norme: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/index.html

C99 l’a dans stdbool.h , mais dans C90 il doit être défini comme un typedef ou enum:

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

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

Alternativement:

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 est un mot clé dans C99: il spécifie un type, tout comme int ou double.

  

6.5.2

     

2 Un objet déclaré comme type _Bool   est assez grand pour stocker les valeurs 0   et 1.

C99 définit bool, true et false dans stdbool.h.

stdbool.h a été introduit dans c99

stdbool.h définit les macros vrai et faux, mais rappelez-vous qu'il est défini comme étant 1 et 0.

C’est pourquoi sizeof(true) vaut 4.

Rien de tel, probablement juste une macro pour int

C99 a ajouté un type bool dont la sémantique est fondamentalement différente de celle de presque tous les types entiers qui existaient auparavant en C, y compris les types définis par l'utilisateur et les extensions-compilateur destinés à cet usage, et que certains programmes peuvent avoir. " type-def " ed to bool a = 0.1, b=2, c=255, d=256;.

Par exemple, étant donné typedef unsigned char bool, le type C99 char définirait les quatre objets sur 1. Si un programme C89 utilisait c, les objets recevraient respectivement 0, 1, 255 et 0. S'il a utilisé bit, les valeurs peuvent être les mêmes que ci-dessus ou __bit peut être -1. S'il avait utilisé un type <=> ou <=> de compilateur-extension, les résultats seraient vraisemblablement 0, 0, 1, 0 (traiter <=> d'une manière équivalente à un champ non signé de taille 1, ou type entier non signé avec un bit de valeur).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top