2012-05-17 7 views
9

私は継承したコードに問題があります。このコードはCのみの環境でうまく構築されていましたが、今はこのコードを呼び出すためにC++を使用する必要があります。ヘッダproblem.hは含まれていますboolがmixed C/C++で定義されているか確認してください

#ifndef _BOOL 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 

struct astruct 
{ 
    bool myvar; 
    /* and a bunch more */ 
} 

を私はC++のコードとしてコンパイルするとき、私は私が理解していないextern "C" { ... }#include "problem.h"を(ラップ場合がある必要があるので、私は、同じエラーを取得しerror C2632: 'char' followed by 'bool' is illegal

を取得しますCとしてコンパイルするには、noキーワードboolならない)

私は#ifndef _BOOLから#endifにブロックを除去し、C++としてコンパイルしてみました、と私はエラーを取得:?

error C2061: C requires that a struct or union has at least one member
error C2061: syntax error: identifier 'bool'

私はC++コンパイラはboolの再定義について不平を言っているか理解していない、まだ私は再定義を削除し、ちょうど変数を定義するboolを使用しようとすると、それは何も見つかりません。

ご協力いただきまして誠にありがとうございます。

+2

「extern」C「 'は「Cとしてコンパイル」を意味しないことに注意してください。これは「Cリンケージでコンパイルする」ことを意味します。内部のコードはまだC++であり、Cとしてリンクできないものは定義できません。 –

答えて

15

boolはC++では基本型であるため(Cではなく)、再定義することはできません。あなたは

#ifndef __cplusplus 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 
+0

Damnit、あなたはそれに勝ちます:) –

+1

しかし、このコードはC99の 'stdbool.h'と互換性がありません。注意! –

+0

'' char''が '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – prelic

5

でコードを囲むことができ

あなたはC99のboolを使用することができます。

#ifndef __cplusplus 
#include <stdbool.h> 
#endif 

bool myBoolean; // bool is declared as either C99's _Bool, or C++'s bool data type. 

なぜあなたはこれを使うべきでしょうか?

他のC99コードとの互換性。 _BoolはC99コードでよく使用されており、非常に便利です。また、背後にあるように、たくさんのものをtypedefする必要なくブール型のデータ型を持つことができます。_Boolは、コンパイラによって定義されたデータ型です。

+0

何もメモリ内に1ビットしかかかりません。あなたはバイトを書くことを意味しましたか? –

+0

@LuchianGrigoreいいえ、私は少し意味があります。構造体では、boolも同様の方法でパックされています。 –

+0

標準ではcharのサイズ以外のサイズは何も言わない。残りは実装定義です。ブールを格納するために1Mbを使用する標準準拠のコンパイラが存在する可能性があります。 –

1

あなたは__cplusplusマクロを使用する必要があります。

#ifndef __cplusplus 
#ifndef _BOOL 
typedef unsigned char bool; 
static const bool False = 0; 
static const bool True = 1; 
#endif 
#endif 

詳細はこのlink to the C++ FAQをチェックしてください。

-3

私はこの「 'char」に続いて' bool 'はVSでも問題があります。 私の問題は、クラス・宣言をセミ・コロンで終わらせなかったことです。これはヘッダー・ファイルに問題があるとは思っていませんでした。問題はcppファイルに出てきました! 例:

class myClass 
{ 

}; // <-- put the semi colon !! 
+2

これは 'bool'とどのように関連していますか? –

+0

私はまた、VSのエラーを取得していましたが、 "'char'の後に 'bool'が来るのは違法です。VSで - 私のための修正はクラス宣言の末尾にセミコロンを追加するだけでした。 –

+0

@JustinHirsch Visual StudioはIDEであり、プログラミング言語ではありません。 – cybermonkey

関連する問題