web-dev-qa-db-ja.com

VS 2010で '#include <stdbool.h>'を使用しようとしています

Cプログラムでstdbool.hライブラリファイルを使用しようとしています。しかし、コンパイルしようとすると、intellisenseがソースファイルstdbool.hを開けないというエラーメッセージが表示されます。

誰もが私にビジュアルスタジオにこれを認識させる方法を教えてもらえますか?このヘッダーファイルは有効ですか? Cプログラミングの学習に関する本を読んでいます。

24
John
typedef int bool;
#define false 0
#define true 1

正常に動作します。 Windowsヘッダーも同じことを行います。 intに2ビット値を格納することによって消費される「無駄な」メモリについて心配する理由はまったくありません。

Alexandreがコメントで述べたように、MicrosoftのCコンパイラ(Visual Studioにバンドルされています) C99はサポートされていません で、おそらくそうではありません。 stdbool.hおよびその他のはるかに便利な機能がC99ではサポートされていますが、Visual Studioではサポートされていません。それは過去に行き詰まり、C89として知られる古い規格のみをサポートします。ブロックの先頭以外の場所で変数を定義しようとして問題が発生していないことに驚いています。それは私がVSでCコードを書くたびに私に噛みつきます

考えられる回避策の1つは、コードをC++としてコンパイルするようにVisual Studioを構成することです。そうすれば、ほとんどC99の本で読んだすべてが、コンパイラが詰まることなく機能します。 C++では、型boolが組み込まれています(Cモードのような4バイト型ではなく、C++モードでは1バイト型です)。この変更を行うには、IDE内でプロジェクトのコンパイル設定を編集するか、ファイルの名前をcpp拡張子(cではなく)に変更するだけです。 VSはそれに応じて自動的にコンパイルモードを設定します。

Visual Studioの最新バージョン(2013以降)では、C99のサポートが改善されていますが、まだ完全ではありません。正直なところ、C(したがって、今日のC99)を学ぼうとしている場合のより良い解決策は、別のコンパイラを選択することです。 MinGW は、Windowsで実行している場合に適したオプションです。 Code :: Blocks IDEのような多くの人々

27
Cody Gray

次のようなstdbool.hを置き換える独自のファイルを作成します。

#pragma once

#define false   0
#define true    1

#define bool int

Visual Studio 2010では、他で示唆されているようにtypedef int bool;の使用に問題がありました。 IntelliSenseは、「型指定子の無効な組み合わせ」について不満を述べました。 "bool"という名前は、定義されていなくても、まだ特別なようです。

13
cherno

警告と同様に、x64プラットフォームでは、VS2017(以前のバージョンについてはわかりません)は、boolをC++の1バイトの値として定義します(たとえば、char)。したがって、この

typedef int bool;

cファイルでint(4バイト)として、またC++(1バイト)でネイティブのboolとして使用すると、本当に危険な場合があります(たとえば、.hstructは、 CまたはC++)。

2
dacap