2017-05-30 14 views
0

私はシステムワークベンチ4 stm32(eclipse)で動作します。 私は、C++ファイルにC(問題ありません)が含まれ、CファイルにC++ファイル(大きな問題)が含まれているC/C++の混在プロジェクトがあります。eclipse c/C++プロジェクト、GCCコンパイルG ++コード

私は明らかにC++ファイルでは.cpp/.hpp、cファイルでは.c/.hを定義しています。また、__cpluplus extern "C"の場合は、どのCファイルも宣言されていません。

しかしGCCのコンパイルでは、C++ヘッダー(.hpp)がGCCでコンパイルされ、 "unknown type class"と伝えられますが、これは間違ったC++(。 HPP)私はこのプロジェクトで作業することができますどのように

オプションA: は何とかプロジェクトのGCCコンパイラを削除して、Gと連携++のみ

質問A1:どのようにあなたは、コンパイラを削除するにはプロジェクト? 質問A2: は厳格なトップ町のアーキテクチャを有する、ここで、私は私のコンパイラは、すべての

オプションBでのようにdoesent型キャストの多くを行い例えばfreertosを使用するのでグラムの++は、かなりよりうるさいと文句を言わない、すべてをコンパイルしていますC++はcファイルをインクルードすることができますが、それ以外の方法では使用できません(コールバック/ ISRハンドリングを行うstm32 halレイヤーを使用するので良いオプションではありません)。

NO OPTION : のgccを使用することでのみ

どのようにそのようなことを解決するのです おかげで多くのことを?つもりはその後 限り、GCCでコンパイルすると、私の「未知の型クラス」を教えて...だろうが、その後、C++ヘッダ(.HPP)につながる、GCCのコンパイルこの:-)上

+1

'#include's C++ヘッダー* Cソースファイル*ではありません。 これはC++ソースファイルです。 (C++ヘッダーの とそれに含まれるファイルにCコードだけが含まれていない限り、それは本当にCヘッダーではなく、実際はCヘッダーです) このようなソースファイルを呼び出すのは無意味です'foo.c'です。それは はC++コンパイラでしかコンパイルできません: 'foo.cpp'と呼んでください。 –

+0

hi mike。あなたのご意見ありがとうございます。基本的には、厳密なトップダウンアーキテクチャ(.cppファイルには.hファイルが含まれていますが、.hppには.hppを含めることはできません)がありますが、私のコードはすべて基本的にC++として完全にコンパイルされる+ +コードです。 私が理解できないことは、なぜ私はg ++とgccコンパイラをEclipseプロジェクト内に持つ必要があるのですか?ビルド出力からgccは.cに使用され、g ++はすべてのファイルに対してg ++を使うことができるときに.cppに使用されます。 –

答えて

1

を夢中私は、あなたがそれは同じ言語を使用して、を含むファイルの一部としてコンパイルされ、.cまたは.cppファイルにを含むことができ、そのdeclaired C++(.HPP)

ので、これは起こるはずの知っている それがその一部であるかのように。例としてQtヘッダーを見ると、それらはQWidgetQStringのような名前であり、拡張子はまったくありません。それらにはqwidget.hqstring.hが含まれています。これらは有効なCファイルではなく、多くのクラスが定義されています。私は今、私が働いているプロジェクトでこれをやっている:

bar.txtは番号のリストだけで
uint8_t foo[] = { 
#include "bar.txt" 
}; 

を。コンパイラは拡張機能を気にしません。あるいは、それが有効なCまたはC++ファイルではありません。

あなたはそれがCで使用可能ではありませんので、例

#ifdef __cplusplus 
int foo(int); 
int foo(int, int); 
class example { 
public: 
    example(int); 
    int field; 
}; 
extern "C" { 
#endif 
int bar(int); 
#ifdef __cplusplus 
} 
#endif 

foo()のために、あなたのC++ Cとの互換性はありませんヘッダーでオーバーロードされている構造をマスクする#ifdef __cplusplusを使用することができ、かつextern "C"ブロックに行くことができません、したがっての中にはgccから隠れると宣言されています。クラス宣言も同様に保護されています。bar()は、.cppファイルで定義することができ、それはCコードから呼び出すことができ、クラス、オーバーロードされた関数などの任意のC++構造体で動作することができます。

関連する問題