我正在重构一个相当大的代码库。以旧方式,有两个库:FooFactory
和BarLib
. BarLib
依赖于FooFactory
哪个又依赖于很多Foo1
, Foo2
,Foo3
代码等...在构建时,FooFactory
拉入所有Foo
依赖项,然后BarLib
可以FooFactory
用来请求构建,例如 a Foo7
。在我的重构中,我让所有的FooX
人都依赖FooFactory
(而不是相反),如果makefile碰巧链接了他们,我会静态地注册他们自己。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
给,Foo14
因为它遵守为构造Foo
. 如果我将字符串theString
放入Foo14.C
然后将强制BarLib
依赖Foo14
以设置它......所以我想知道我是否可以将它保留在中FooFactory.C
,但将其Foo14
声明为 extern 并使用它。即使theString
在匿名命名空间中,这是否有效FooFactory.C
?或者它现在必须是一个全球性的生活在标题中?或者什么是替代解决方案?