2009-07-27 13 views
0

(IDEに頼る以上の場合)奇妙なEclipseのC++の#define行動

私はユニットテストの目的のために、C++としてコンパイル一部のレガシーCコードを持っています。 Cソースは、条件付きでが環境に基づいてと定義されていることをC++で認識しています。

など。 (PRIVATEstaticに解決):

#if!defined __cplusplus 
#define PRIVATE1 PRIVATE 
#endif 

...

PRIVATE1 const int some_var; 

問題は、私はちょうどPRIVATE1がに解決またはC++であるものを見つけることができないようで、コンパイラが再定義を訴えます私は宣言を追加するが、どこに指示しないのか?

私のMinGW/gccインクルードパス、C++ ISO仕様、およびC++の本を検索しましたが役に立たなくなっています。

編集:私は投稿する前に、コマンドラインやmakefileを確認

確かに。

+0

あなた自身の質問に答えて答えを受け入れる必要があります。これには2つの利点があります:最初に、後で読者に受け入れられたアンサーがあったことが明らかになります。 2つは、あなたが実際にあなたの問題を解決するためにいくつかの評判を得ることができます... – RBerteig

+0

@RBerteig - ポイントが取られ、「正しい」方法で答えられました。ありがとう。 – Oliver

答えて

2

Eclipse C++の管理プロジェクトはちょっと、よく愚かです!

プロジェクトがC++として宣言されている場合でも、ファイル拡張子のビルドに基づいています。HファイルCとして前処理し、別のヘッダーファイルからの#define PRIVATE1に引っ張るないC++ヘッダは同様でラップ:

#ifdef __cpluplus. 

プロジェクトは、次にGにより連結されている++。

4

PRIVATE1PRIVATEに解決され、PRIVATEstaticに解決された場合、その後、PRIVATE1staticに解決されます。

+0

論理を破ることはできません:-) –

+3

この定義は '#if!__ cplusplus'ブロックにあるという事実を忘れました。私。 C++コンパイラでは実行されませんが、後者は何らかの形で「プライベート」が何であるかを把握しています。 –

5

ISO C++仕様では、このようなものはありません。ほとんどの場合、PRIVATE1(およびPRIVATE)は、プロジェクトの他の場所で定義されています。これは.hファイルの#defineである必要はなく、makefile内のコンパイラスイッチによって定義することもできます。私は、プロジェクトのディレクトリに完全なgrepを行うことをお勧めします。

+0

"C++のISO仕様とC++の本は利用できませんでした。 – Oliver

2

MinGW自体で定義されていることはありませんが、不可能ではありません。 C++またはCの実装で定義されたマクロは、アンダースコアで始まる必要があります。

0

C++では、おそらく「プライベート」と定義されています。

+0

OPのコードが構文エラーに拡張されるため、Mosdtはそうではない可能性があります。 –

+0

申し訳ありませんが、私は "プライベート"を意味します。これは有効でしょう –

+0

それからクラスの一部である必要があります。これはCとC++でコンパイル可能なので、クラスの一部ではない可能性があります。 –

1

最も良い方法は、プリプロセッサの出力を見ることです。あなたはあなたが使用しているコンパイラを投稿しませんでしたが、ドキュメントをチェックすると、ほとんどの場合、 "Preprocess to file"オプションがあり、すべてのマクロが置換されたファイルが作成されます。これは何が起きているのかを理解するのに役立つかもしれません。 Visual Studioでは、foo.cをfoo.iに変換する/ Eオプション(C/C++ - >プリプロセッサ - >プリプロセスファイルの生成)を使用します。このファイルは、元のソースファイルと比較して一般的に巨大なので、下にスクロールしてコードを確認してください。

0

PRIVATE1で関数を宣言できますか?もしそうなら、ちょうどそのような関数を書いてください:

PRIVATE1 void Foo() { 
    // __FUNCSIG__ in Visual Studio, not sure about GCC 
    std::cout << __FUNCSIG__ << std::endl; 
}