1

Visual Studio2008を使用してc++でライブラリ(.lib)を作成しています。変数を設定して、変数に応じてライブラリの動作を変更したいと思います。多くを単純化すると、次のようになります。

#ifdef OPTION1
i = 1;
#else
i = 0;
#endif

ただし、変数(この場合はOPTION1)はライブラリ自体ではなく、ライブラリにリンクするコードで定義する必要があります。これにより、変数の定義を変更するだけで、プログラムからさまざまな動作を取得できますが、常に同じライブラリ。

これは可能ですか、そしてどのように?それとも、私が望むことを達成するためのよりエレガントな方法はありますか?

4

2 に答える 2

1

これを実現するには、マクロに依存するコードを、ライブラリ自体の一部としてではなく、ライブラリにリンクするコードの一部としてコンパイルする必要があります。あなたができる最善のことは次のようなものです:

パブリック.hファイル:

namespace LibraryPrivate {

void functionForOptionSet();
void functionForOptionUnset();

}

#ifdef OPTION1
inline void dependentBehaviour() {
  LibraryPrivate::functionForOptionSet();
}
#else
inline void dependentBehaviour() {
  LibraryPrivate::functionForOptionUnset();
}
#endif

ライブラリの.cppファイル:

namespace LibraryPrivate {

void functionForOptionSet()
{ i = 1; }

void functionForOptionUnset()
{ i = 0; }

}

つまり、ライブラリに両方のオプションを実装する必要がありますが、マクロに基づいて(部分的に)インターフェイスを制限することができます。charWinAPIがvs.wchar_t関数で行うことのようなものです。ifは両方SomeFunctionA(char*)を提供し、次にそれらの1つに展開するSomeFunctionW(wchar_t*)マクロを提供します。SomeFunction

于 2012-12-07T15:37:56.207 に答える
1

簡単な答えはノーです。のようなもの#ifdefは、コンパイラによって完全に処理されます(実際、コードを解析する前に、コンパイラのプリプロセッサフ​​ェーズによって処理されます)。.libファイルはすでにコンパイルされています。

1つの解決策は、ライブラリをソース形式で提供し、クライアントにプロジェクトの一部としてコンパイルさせることです。これには、コンパイラオプションのすべての可能な組み合わせを使用して、コンパイラのすべてのバージョンを自動的にサポートするという追加の利点があります。また、ライブラリが、テストしたことのないバージョンのコンパイラおよびコンパイラオプションで使用され、テストすらできない可能性があるという欠点もあります。

それ以外の場合は、。ではなく、変数、およびifsとを使用する必要があります。そして、あなたは変数を設定するいくつかの手段を手配する必要があります。?:#ifdef

最後に、そのような変数が1つしかない場合は、ライブラリのバージョンの2つの異なるセットを提供することを検討してください。1つはセットあり、もう1つはセットなしです。次に、クライアントはどちらを使用するかを決定します。多くの点で、これは最も単純なソリューションですが、確実に拡張性はありません。このような変数が100個ある場合、それらが独立していると、2^100さまざまなバリアントのセットが必要になり、どのディスクにも収まりません。

于 2012-12-07T16:01:06.213 に答える