我正在重构一个相当大的代码库。以旧方式,有两个库:FooFactory
和BarLib
。BarLib
取决于FooFactory
,而又取决于大量的Foo1
、Foo2
、Foo3
代码等。构建后,FooFactory
拉入所有Foo
依赖项,然后BarLib
可以使用FooFactory
来请求构建,例如,Foo7
。在我的重构中,我让所有FooX
的人都依赖于FooFactory
(而不是相反),如果 makefile 碰巧链接了它们,则静态注册自己。BarLib
仍然依赖于FooFactory
,但只有在链接并因此静态注册到FooFactory
中时,才能成功创建Foo7
。
我遇到了以下问题:
有一个特殊的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
的匿名命名空间中,这也能工作吗?还是现在必须成为标题中的全球生活?或者什么是替代解决方案?
您不能从另一个文件引用匿名命名空间中定义的变量,请参阅此处的详细信息: 匿名命名空间
不必在共享标头中定义全局变量。要允许从其他文件引用,它们不在匿名命名空间中定义就足够了,也不是静态的。