質問

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

役に立ちましたか?

解決

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

C99では、ネイティブタイプは実際には_Boolと呼ばれますが、stdbool.htrueで定義された標準ライブラリマクロです(これは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のキーワードです。intdoubleと同様にタイプを指定します。

  

6.5.2

     

2タイプ_Boolとして宣言されたオブジェクト   値0を格納するのに十分な大きさ   および1。

C99はbool、trueおよびfalsestdbool.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つの符号なし整数型)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top