2016-06-01 9 views
0

私は適切なキーワードを見つけることができなかったかもしれないので、私はgoogleで疑問を明確にすることができませんでした。親プロジェクトでプリプロセッサ定義を再定義する必要はありますか?

私は2つのC++プロジェクトを持っているとしましょう。 projAおよびprojB。私は、プロジェクトの設定としてMYVARを定義し、projA.a静的ライブラリを生成するprojAをコンパイル

class myClass 
{ 
... 
#ifdef MYVAR 
virtual ~myClass() {} 
#endif 
} 

:projAでexmpl.hファイルで は、この条件があります。

今、projBからprojAのexmpl.hを使用する必要があります。単にそれを組み込み、projA.a静的ライブラリを使用してprojBをコンパイルします。

しかし、私がしたことは、は、MYVARを定義していません。

  • この場合、どうなりますか? projBは#ifdefのコードをスキップしますが、#ifdefのコードでコンパイルされた静的ライブラリを使用していますか?

  • このエラーは予期しない動作ですか?

  • サブプロジェクトやそれを使用するすべてのプロジェクトで使用されたすべてのプリプロセッサ定義を定義する必要はありますか?

ありがとう。

+2

Oh my。ただしないでください。重大なXY問題のように見えます。 –

+1

1つにつき1つ質問してください。 –

答えて

2

両方のプロジェクトで使用されるmyClassの定義が同じでなければならない、それ以外の場合は未定義の動作を引き起こし、One Definition Ruleの違反だ(つまり、コンパイラが違反をご紹介するために必要とされていない、である)不要な診断。

したがって、projBにはMYVARを定義する必要があります。また、両方のプロジェクトで使用される定義に影響を与える他の定義も定義する必要があります。

これはもちろん、両方のプロジェクトで使用されているODRエンティティのみに適用されます。

+0

projAを配布したいときは、適切な方法は何ですか?定義する必要があることをユーザーに伝えるだけですか?それとも他の練習はありますか? –

+0

@MertMertceバイナリ形式で配布する場合、このような定義はありません。ソース形式で配布する場合は、これらのマクロが定義されている場所にconfig.hファイルを追加し、ユーザーが#コードに#includeする必要があります。 –

関連する問題