我正在重构一个相当大的代码库。以旧方式,有两个库:FooFactory
和BarLib
。 BarLib
取决于FooFactory
,Foo1
依赖于大量Foo2
,Foo3
,FooFactory
代码等......构建时Foo
引入所有BarLib
个依赖项,然后FooFactory
可以使用Foo7
来请求构建FooX
。在我的重构中,我让所有FooFactory
人依赖于BarLib
(而不是相反),并且如果makefile恰好链接它们,则静态注册自己。 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
来设置它...所以我想知道我是否可以保留它在theString
中,但在FooFactory.C
中将其声明为extern并使用它。即使{{1}}位于{{1}}的匿名命名空间中,这是否也能正常工作?或者它现在必须成为一个全球生活在标题?或者什么是替代解决方案?
答案 0 :(得分:1)
您无法从另一个文件引用匿名命名空间中定义的变量,请参阅此处:anonymous namespace
不必在共享标头中定义全局变量。为了允许从其他文件引用,它们足以使它们不是在匿名命名空间中定义而不是静态。