bool はネイティブ C 型ですか?
-
05-07-2019 - |
質問
Linux カーネル コードで bool が使用されていることに気づきましたが、bool は C++ 型だと思っていました。bool は標準の C 拡張子 (ISO C90 など) ですか、それとも GCC 拡張子ですか?
解決
bool
は現在のC-C99に存在しますが、C89 / 90には存在しません。
C99では、ネイティブタイプは実際には_Bool
と呼ばれますが、stdbool.h
はtrue
で定義された標準ライブラリマクロです(これはfalse
に解決されます)。タイプ#if true
のオブジェクトは0または1を保持しますが、#if 0
および<=>も<=>のマクロです。
注、ところで、これは、Cプリプロセッサが<=>が含まれていない限り<=>を<=>として解釈することを意味します。一方、<=>を言語リテラルとしてネイティブに認識するには、C ++プリプロセッサが必要です。
他のヒント
C99は組み込みの_Bool
データ型を追加しました(詳細については Wikipedia を参照)、 #include <stdbool.h>
の場合、bool
のマクロとして<=>が提供されます。
特にLinuxカーネルについて尋ねました。 <=>の存在を想定し、typedef自体を提供します。 = "noreferrer"> include / linux / types.h 。
いいえ、ありません 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 との違い: 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はbool、true
およびfalse
をstdbool.h
で定義します。
stdbool.h はc99で導入されました
stdbool.h
はマクロをtrueとfalseに定義しますが、1と0に定義されていることを思い出してください。
それがsizeof(true)
が4である理由です。
そのようなことはなく、おそらくintの単なるマクロ
C99はbool
型を追加しました。この型のセマンティクスは、Cに以前存在していたほぼすべての整数型のセマンティクスとは根本的に異なります。 <!> quot; type-def <!> quot; ed to bool a = 0.1, b=2, c=255, d=256;
。
たとえば、typedef unsigned char bool
の場合、C99 char
タイプは4つのオブジェクトすべてを1に設定します。C89プログラムがc
を使用した場合、オブジェクトはそれぞれ0、1、255、および0を受け取ります。 bit
を使用した場合、値は上記のようになるか、__bit
が-1になる可能性があります。コンパイラ拡張<=>または<=>タイプを使用していた場合、結果はおそらく0、0、1、0(サイズ1の符号なしビットフィールドと同等の方法で<=>を処理する、または値ビットが1つの符号なし整数型)。