289

Linux カーネル コードで bool が使用されていることに気付きましたが、bool は C++ 型だと思っていました。bool は標準の C 拡張機能 (ISO C90 など) ですか、それとも GCC 拡張機能ですか?

4

11 に答える 11

399

bool現在の C ~ C99 には存在しますが、C89/90 には存在しません。

C99 では、ネイティブ型は実際には と呼ばれますが_Boolboolは で定義された標準ライブラリ マクロですstdbool.h(これは に解決されると予想され_Boolます)。タイプのオブジェクトは_Bool0 または 1 のいずれかを保持しますが、trueおよびfalseは からのマクロでもありますstdbool.h

ところで、これは C プリプロセッサが含まれていない限り#if trueとして解釈することを意味することに注意してください。一方、言語リテラルとしてネイティブに認識するためには、C++ プリプロセッサが必要です。#if 0stdbool.htrue

于 2009-10-22T16:16:27.980 に答える
128

C99 は組み込みの_Boolデータ型を追加し (詳細はウィキペディアを参照)、 にマクロとして#include <stdbool.h>提供します。bool_Bool

特に Linux カーネルについて質問されました。include/linux/types.h にtypedef 自体が存在することを前提として_Bool提供します。bool

于 2009-10-22T16:21:00.830 に答える
33

C99 ではstdbool.hに含まれていますが、C90 では typedef または enum として定義する必要があります。

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

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

または:

typedef enum { FALSE, TRUE } boolean;

boolean b = FALSE;
if (b) { ... }
于 2009-10-22T16:17:19.007 に答える
31

いいえ、boolISO C90 にはありません。

標準 C (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

カーネルお​​よび標準で使用されている C とのその他の相違点について説明している記事を次に示します。

于 2009-10-22T16:12:42.840 に答える
20
/* 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. */
于 2013-08-21T20:28:59.683 に答える
12

_Boolintは C99 のキーワードです。 orのように型を指定しますdouble

6.5.2

2 _Bool 型として宣言されたオブジェクトは、値 0 と 1 を格納するのに十分な大きさです。

于 2009-10-22T16:19:22.987 に答える
9

C99 は bool を定義しtruefalsein stdbool.h.

于 2009-10-22T16:16:26.980 に答える
2

stdpool.hは c99 で導入されました

于 2009-10-22T16:16:29.920 に答える
-1

そのようなことはありません。おそらく int のマクロです

于 2009-10-22T16:13:50.627 に答える