エラー:不明なタイプ名 'bool'


88

ソースコードをダウンロードして、スキャナーのファイルをコンパイルしたかった。このエラーが発生します:

そして、別のコンパイラを使用してコンパイルしようとしましたが、別のエラーが表示されました。

私のOSは3.0-ARCHですが、なぜこれが起こったのかわかりません。エラーを修正するにはどうすればよいですか?


12
#include <stdbool.h>
leppie 2011年

回答:


151

C90はブールデータ型をサポートしていません。

C99には、次のものが含まれています。


48
あなたが持っているなら、C99はそうします#include <stdbool.h>
キーストンプソン

1
C99には、と呼ばれるネイティブブール型があり_Boolます。<stdbool.h>ヘッダは、それが呼び出されるのtypedefを提供するboolと共に、trueおよびfalse
MM

1
stdbool.hをインクルードせずにOSXでboolのものをうまくコンパイルできるのはなぜですか?
デビッド天宇ウォン

私はいくつかの「C」コードもコピーして貼り付けましたが、答えたとおり、gccコンパイルされたstbool.hを含める必要がありました。ただし、C ++はブール値を「すぐに使用できる」ことを知っているg++ため、コードを変更せずにコンパイルに使用できます。したがって、コンテキスト、コードのソース、およびその他のエラーによっては、cではなくc ++コードを参照している可能性があります。
nuala

55

あなたが持っているなら、C99はそうします

コンパイラがC99をサポートしていない場合は、自分で定義できます。

(ただし、この定義はタイプのABIを変更するboolため、適切に定義された状態でコンパイルされた外部ライブラリに対してリンクboolすると、ランタイムエラーの診断が困難になる可能性があることに注意してください)。


39
定義するために私自身の好みの方法はbool次のとおりです。typedef enum { false, true } bool;
キース・トンプソン

2
typedefタイプをboolではなくとして参照できるようにする必要がありenum boolます。
キーストンプソン

3
後者の方法は、暗黙の変換がないため、本質的にリスクがあります。たとえば、16ビットのintがある場合long FLAG = 0x4000000; bool b = ( x & FLAG );、これにより未定義の動作が発生します(フラグが設定されていてbも、結果がfalseに見える可能性がありますx)。がbool関数パラメータの場合、これを見つけるのは困難です。使用しますが、注意して使用してください。
MM

6
注意してください!これtypedef 、エッジケースでは真のC99ブールと同じようには動作しません。これ、真のC99ブールには2つの値しかないが、これtypedefは多くの値をサポートするだけintでなく、C99にboolはサポートtypedefしない特別なキャストルールがあるためです。例:C99では、(bool)99999998430674944明確にtrueです。あなたとtypedef、私のマシン上でGCCでコンパイルし、(bool)99999998430674944あるfalse(原因キャストする場合、オーバーフローの処理方法に)。
マークアメリー2016

1
@KeithThompsonこのような定義は、通常のブール値でコンパイルされた外部ライブラリとリンクしようとすると、ABIを壊します。
yugr 2018


4

コードのどこかに行があります#include <string>。これ自体は、プログラムがC ++で記述されていることを示しています。したがって、使用するg++方が優れていますgccます。

不足しているライブラリの場合:libl.so。というファイルが見つかった場合は、ファイルシステムを調べてください。使っlocateてみてください、コマンドを/usr/lib/usr/local/lib/opt/flex/lib、またはブルートフォースを使用find / | grep /libl

ファイルを見つけたら、次のようにディレクトリをコンパイラのコマンドラインに追加する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.