0

次のプリプロセッサ ディレクティブを含む .cpp ファイル (check.cpp と呼びましょう) があります。

#ifdef CHECK
// code to execute goes here
#endif

check.cpp ファイルは 2 つの異なるプロジェクトで使用されています。(プロジェクトは同じフォルダーにあり、同じフォルダーにある同じ check.cpp ファイルを共有します)

1 つのプロジェクトでこのコードを実行し、他のプロジェクトではこのコードを実行しないようにします。

最終的に、ProjectA の場合、check.cpp は次のようになります。

#ifdef CHECK
// This code WILL execute
#endif

ProjectB の場合、check.cpp は次のようになります。

#ifdef CHECK
// This code WILL NOT execute
#endif

プリプロセッサ ディレクティブを使用することは可能ですか、それとももっと簡単な方法がありますか?

私の考えは使用することでした

#define CHECK 1

そして、それをプロジェクトの1つに入れ、他のプロジェクトには入れませんが、.cppファイルを機能させるには #define を含める必要があり、このファイルは共有されています...

何か案は?

4

4 に答える 4

2

どのコンパイラを使用しているかはわかりませんが、Visual Studio では、コードを実行するプロジェクトで「CHECK」を定義します。

プロジェクト設定 > 構成プロパティ > C/C++ > プリプロセッサ > プリプロセッサ定義

于 2013-02-26T17:44:37.697 に答える
1

何をするにしても、どのコードをコンパイルするかをコンパイラーに指示する決定ポイントが必要になります。

開発環境が異なれば、この決定ポイントにデータを挿入するさまざまな方法が提供されます。プロジェクトごとに異なる値を持つ環境変数を介して行うことができます。もう 1 つの方法 (よりクリーンな方法) は、コードを 2 つの異なるファイルに分割し、1 つは最初のプロジェクトに、もう 1 つは 2 番目のプロジェクトに含めることです。

于 2013-02-26T17:44:05.457 に答える
0

#definesを使用したアプローチを使用する場合は、次のアプローチをお勧めします。

#ifdef FOO
#define BAR(x) f(x)
#undef FOO
#else
#define BAR(x) g(x)
#endif

そしてProjectA.cppで:

#define FOO
#include "header.h"

void a(int x) {
    BAR(x); // f(x)
}

ProjectB.cppで

#undef FOO
#include "header.h"  
void b(int x) {
    BAR(x); // g(x)
}

これにより、異なる関数の2つのバージョンが呼び出されますが、コードは同じファイルcommon.cppにとどまる可能性があります。したがって、にg(x)固有のコードを実行でき、でに固有のコードをProjectB.cpp実行f(x)できます。ProjectA.cpp

私が質問に正しく答えたことを願っています。

于 2013-02-26T17:46:17.853 に答える
0

それは不可能だと思います。

#ifdef CHECK
...
#endif

CHECK が定義されている場合は常に実行されます。同封のコードをプロジェクトに含めない唯一の方法は、そのプロジェクトの CHECK が定義されていた場合にその定義を解除することです。

#undef CHECK

プロジェクトBで

于 2013-02-26T17:45:10.117 に答える