Linuxカーネルのコードがboolを使っていることに気づきましたが、boolはC++型だと思いました。 boolは標準のC拡張子(例:ISO C90)ですか、それともGCC拡張子ですか。
bool
は現在のC - C99に存在しますが、C89/90には存在しません。
C99では、ネイティブ型は実際には_Bool
と呼ばれていますが、bool
はstdbool.h
で定義されている標準ライブラリマクロです(これは予想どおり_Bool
に解決されます)。 _Bool
型のオブジェクトは0または1を保持しますが、true
およびfalse
はstdbool.h
からのマクロでもあります。
ところで、これは#if true
が含まれていない限り、Cプリプロセッサが#if 0
をstdbool.h
として解釈することを意味することに注意してください。一方、C++プリプロセッサはtrue
を言語リテラルとしてネイティブに認識する必要があります。
C99は組み込みの_Bool
データ型を追加し(詳細は Wikipedia を参照)、#include <stdbool.h>
の場合、_Bool
のマクロとしてbool
name__を提供します。
あなたは特にLinuxカーネルについて尋ねました。これは_Bool
が存在することを前提としており、 include/linux/types.h でbool
typedef自体を提供します。
いいえ、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
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) { ... }
/* 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
はC99のキーワードです。int
やdouble
と同じように型を指定します。
6.5.2
2 _Bool型として宣言されたオブジェクトは、値0と1を格納するのに十分な大きさです。
C99はstdbool.h
にbool、true
およびfalse
を定義しています。
stdbool.h はc99で導入されました
stdbool.h
はマクロのtrueとfalseを定義しますが、1と0になるように定義されていることを忘れないでください。
sizeof(true)
が4であるのはそのためです。
そのようなことはありません、おそらくintのマクロだけです
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
を扱う)になります。ビット)。