0

私はかなり大きなコードベースをリファクタリングしています。古い方法では、2つのライブラリがあります:FooFactoryBarLibBarLib依存関係は、ビルド時にFooFactory多くの、、Foo1コードなどに依存し、すべての依存関係を取得してから、たとえば、の構築を要求するために使用できます。私のリファクタリングでは、すべての人を依存させており(その逆ではありません)、makefileがそれらをリンクしている場合は静的に登録します。に依存しますが、リンクされて静的にに登録されている場合にのみ作成に成功します。Foo2Foo3FooFactoryFooBarLibFooFactoryFoo7FooXFooFactoryBarLibFooFactoryFoo7FooFactory

私は次の問題に遭遇しています:

特別なものがありFoo14ます。これは、メインのファクトリファイルが設定する文字列FooFactory.Cで構成されます。これが機能する方法は、呼び出されたグローバル関数を公開し、ファイル内で匿名名前空間に変数を持っていることです。次に、のメソッドは、この関数を使用してこの文字列を設定する場合と使用しない場合があります。そして、のコーパスでは、この文字列はの構築中にチェックされます。FooFactoryBarLibFooFactory.HsetString(const std::string&);.Cstd::string theStringBarLibFooFactory.CFoo14

問題は、依存関係が逆になっているため、男性のすべての構築コードFooがそれぞれのライブラリ内に保持され、静的に登録されている場合にのみ呼び出されることです。を構築するために渡される引数の共通インターフェースに従うため、これstd::stringをに渡す簡単な方法はありません。文字列を入れると、それを設定するために依存することになります...それで、私はそれを保持できるかどうか疑問に思いましたが、それをexternとして宣言し、それを利用します。の匿名名前空間にある場合でも、これは機能しますか?それとも、今ではヘッダーにグローバルに住んでいる必要がありますか?または、代替ソリューションは何ですか?Foo14FootheStringFoo14.CBarLibFoo14FooFactory.CFoo14theStringFooFactory.C

4

1 に答える 1

1

匿名の名前空間で定義された変数を別のファイルから参照することはできません。詳細については、匿名の名前空間を参照してください。

グローバルは、共有ヘッダーで定義する必要はありません。他のファイルから参照できるようにするには、それらを匿名の名前空間ではなく静的として定義するだけで十分です。

于 2012-12-05T22:07:55.677 に答える