私はかなり大きなコードベースをリファクタリングしています。古い方法では、2つのライブラリがあります:FooFactory
とBarLib
。BarLib
依存関係は、ビルド時にFooFactory
多くの、、Foo1
コードなどに依存し、すべての依存関係を取得してから、たとえば、の構築を要求するために使用できます。私のリファクタリングでは、すべての人を依存させており(その逆ではありません)、makefileがそれらをリンクしている場合は静的に登録します。に依存しますが、リンクされて静的にに登録されている場合にのみ作成に成功します。Foo2
Foo3
FooFactory
Foo
BarLib
FooFactory
Foo7
FooX
FooFactory
BarLib
FooFactory
Foo7
FooFactory
私は次の問題に遭遇しています:
特別なものがありFoo14
ます。これは、メインのファクトリファイルが設定する文字列FooFactory.C
で構成されます。これが機能する方法は、呼び出されたグローバル関数を公開し、ファイル内で匿名名前空間に変数を持っていることです。次に、のメソッドは、この関数を使用してこの文字列を設定する場合と使用しない場合があります。そして、のコーパスでは、この文字列はの構築中にチェックされます。FooFactory
BarLib
FooFactory.H
setString(const std::string&);
.C
std::string theString
BarLib
FooFactory.C
Foo14
問題は、依存関係が逆になっているため、男性のすべての構築コードFoo
がそれぞれのライブラリ内に保持され、静的に登録されている場合にのみ呼び出されることです。を構築するために渡される引数の共通インターフェースに従うため、これstd::string
をに渡す簡単な方法はありません。文字列を入れると、それを設定するために依存することになります...それで、私はそれを保持できるかどうか疑問に思いましたが、それをexternとして宣言し、それを利用します。の匿名名前空間にある場合でも、これは機能しますか?それとも、今ではヘッダーにグローバルに住んでいる必要がありますか?または、代替ソリューションは何ですか?Foo14
Foo
theString
Foo14.C
BarLib
Foo14
FooFactory.C
Foo14
theString
FooFactory.C