Linux カーネル コードで bool が使用されていることに気付きましたが、bool は C++ 型だと思っていました。bool は標準の C 拡張機能 (ISO C90 など) ですか、それとも GCC 拡張機能ですか?
11 に答える
bool現在の C ~ C99 には存在しますが、C89/90 には存在しません。
C99 では、ネイティブ型は実際には と呼ばれますが_Bool、boolは で定義された標準ライブラリ マクロですstdbool.h(これは に解決されると予想され_Boolます)。タイプのオブジェクトは_Bool0 または 1 のいずれかを保持しますが、trueおよびfalseは からのマクロでもありますstdbool.h。
ところで、これは C プリプロセッサが含まれていない限り#if trueとして解釈することを意味することに注意してください。一方、言語リテラルとしてネイティブに認識するためには、C++ プリプロセッサが必要です。#if 0stdbool.htrue
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) { ... }
いいえ、boolISO C90 にはありません。
標準 C (C99 ではない) のキーワードのリストを次に示します。
autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedstaticstructswitchtypedefunionunsignedvoidvolatilewhile
カーネルおよび標準で使用されている 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. */
_Boolintは C99 のキーワードです。 orのように型を指定しますdouble。
6.5.2
2 _Bool 型として宣言されたオブジェクトは、値 0 と 1 を格納するのに十分な大きさです。
C99 は bool を定義しtrue、falsein stdbool.h.
stdpool.hは c99 で導入されました
そのようなことはありません。おそらく int のマクロです