Linux カーネル コードで bool が使用されていることに気付きましたが、bool は C++ 型だと思っていました。bool は標準の C 拡張機能 (ISO C90 など) ですか、それとも GCC 拡張機能ですか?
11 に答える
bool
現在の C ~ C99 には存在しますが、C89/90 には存在しません。
C99 では、ネイティブ型は実際には と呼ばれますが_Bool
、bool
は で定義された標準ライブラリ マクロですstdbool.h
(これは に解決されると予想され_Bool
ます)。タイプのオブジェクトは_Bool
0 または 1 のいずれかを保持しますが、true
およびfalse
は からのマクロでもありますstdbool.h
。
ところで、これは C プリプロセッサが含まれていない限り#if true
として解釈することを意味することに注意してください。一方、言語リテラルとしてネイティブに認識するためには、C++ プリプロセッサが必要です。#if 0
stdbool.h
true
C99 は組み込みの_Bool
データ型を追加し (詳細はウィキペディアを参照)、 にマクロとして#include <stdbool.h>
提供します。bool
_Bool
特に Linux カーネルについて質問されました。include/linux/types.h にtypedef 自体が存在することを前提として_Bool
提供します。bool
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) { ... }
いいえ、bool
ISO 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 とのその他の相違点について説明している記事を次に示します。
/* 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
int
は C99 のキーワードです。 orのように型を指定しますdouble
。
6.5.2
2 _Bool 型として宣言されたオブジェクトは、値 0 と 1 を格納するのに十分な大きさです。
C99 は bool を定義しtrue
、false
in stdbool.h
.
stdpool.hは c99 で導入されました
そのようなことはありません。おそらく int のマクロです