私はプログラムを書いているので、C++で書きたいと思っていますが、boolを再定義するCヘッダーを含める必要があります。
# define false 0
# define true 1
typedef int bool;
明らかな解決策は、ヘッダーを編集して次のようにすることです。
#ifndef __cplusplus
# define false 0
# define true 1
typedef int bool;
#endif
しかし、残念ながら、ライブラリは読み取り専用であるため、私はできません。
このtypedefを無視するようにgccに指示する方法はありますか?または、ほとんどの関数をC++で記述してから、2つのCラッパーを作成できますか?それとも、それを吸い上げてCで書くべきですか?
あなたはそれをハックすることができます!
ライブラリは、それをfooLib
と呼び、定義する特権を持つタイプbool
を使用していると考えています。ライブラリにとって、bool
は単なる識別子です。
したがって、代わりに別の識別子を使用するように強制することができます。
#define bool fooLib_bool
#include "fooLib.h"
#undef bool
#undef true
#undef false
これで、コンパイラは問題のある行が次のように変換されていることを確認します。
typedef int fooLib_bool;
実際のbool
の代わりにタイプfooLib_bool = int
を使用するインターフェースで立ち往生していますが、コードが実際にはint
のプロパティに依存している可能性があるため、回避することは不可能です。そして、ライブラリバイナリは、そのような仮定を組み込んでコンパイルされたはずです。
問題のあるコードをヘッダーにラップしてから、不要なものを定義解除できると思います
Library_wrapper.h:
#define bool something_else // This will get you past the C++ compilation
#include "library.h"
#undef false
#undef true
#undef bool
main.cpp:
#include "Library_wrapper.h"
#include "boost.h"
Typedefに関して..C++で基本型を再定義しようとすると、コンパイラは文句を言うはずです。ちなみに、型を再宣言するか(C++で許可されています)、定義することができます(単純なテキスト置換)。
残念ながら、いいえ、このファイルを標準C++で使用することはできません。
§7.1.3[dcl.typedef]
6 /特定のスコープでは、typedef指定子を使用して、そのスコープで宣言されたタイプの名前を再定義して、別のタイプを参照することはできません。
したがって、typedef ... bool;
は禁止されています。
§17.6.4.3.1[macro.names]
2 /翻訳単位は、キーワード、表3にリストされている識別子、または7.6に記載されている属性トークンと字句的に同一の名前を
#define
または#undef
してはなりません。
そして§2.12[Lex.key]では、bool
がキーワードであることがわかります。
したがって、問題のあるファイルを含める前に#define bool ...
を使用してコンパイラをだまそうとすることは、禁止されています。
それで、代替手段は何ですか?シム!
独自のCおよびC++互換ヘッダーの背後にある問題のあるライブラリを分離します。そして、この部分をCとしてコンパイルします。その後、問題やトリックなしで、C++プログラムに独自のヘッダーを含めることができます。
注:はい、ほとんどのコンパイラはおそらく#define bool ...
を受け入れますが、それでも標準では明示的に禁止されています。
不正なヘッダーをコピーして、編集したコピーを使用することができます。コンパイラに優先するパスを指示し、...
ヘッダーをCとして使用するコードをコンパイルしてから、C++オブジェクトファイルとリンクするだけです。おそらくMSVCまたはGCCを使用します。どちらもC++またはCとしてコードをコンパイルでき、互換性のあるオブジェクトファイルを作成できます。
それがクリーンな解決策なのか、不必要なやり過ぎなのかは、実際には正確な状況によって異なります。