web-dev-qa-db-ja.com

boolはネイティブCの型ですか?

Linuxカーネルのコードがboolを使っていることに気づきましたが、boolはC++型だと思いました。 boolは標準のC拡張子(例:ISO C90)ですか、それともGCC拡張子ですか。

242
asussex

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

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

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

337
AnT

C99は組み込みの_Boolデータ型を追加し(詳細は Wikipedia を参照)、#include <stdbool.h>の場合、_Boolのマクロとしてboolname__を提供します。

あなたは特にLinuxカーネルについて尋ねました。これは_Boolが存在することを前提としており、 include/linux/types.hbooltypedef自体を提供します。

115
Josh Kelley

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

これは標準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とのいくつかのその他の相違点を説明した記事です。 http://www.ibm.com/) developerworks/linux/library/l-gcc-hacks/index.html

32
BobbyShaftoe

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) { ... }
29
Rob
/* 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. */
15
user2705144

_BoolはC99のキーワードです。intdoubleと同じように型を指定します。

6.5.2

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

11
pmg

C99はstdbool.hにbool、trueおよびfalseを定義しています。

6
starblue

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

2
Nick Van Brunt

stdbool.hはマクロのtrueとfalseを定義しますが、1と0になるように定義されていることを忘れないでください。

sizeof(true)が4であるのはそのためです。

1
Neha Gangwar

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

0
sindre j

C99はbool型を追加しました。その意味論は、そのような目的のために意図されたユーザ定義型やコンパイラ拡張型を含め、Cでこれまで存在していたほぼすべての整数型のものとは根本的に異なります。 boolに追加されました。

例えば、bool a = 0.1, b=2, c=255, d=256;を指定すると、C99のbool型は4つのオブジェクトすべてを1に設定します。C89プログラムがtypedef unsigned char boolを使用した場合、オブジェクトはそれぞれ0、1、255、および0を受け取ります。 charを使用した場合、値は上記のようになるか、cが-1になることがあります。コンパイラ拡張のbitまたは__bit型を使用した場合、結果はおそらく0、0、1、0(サイズ1の符号なしビットフィールド、または1つの値を持つ符号なし整数型と同等の方法でbitを扱う)になります。ビット)。

0
supercat