0

我正在重构一个相当大的代码库。以旧方式,有两个库:FooFactoryBarLib. BarLib依赖于FooFactory哪个又依赖于很多Foo1, Foo2,Foo3代码等...在构建时,FooFactory拉入所有Foo依赖项,然后BarLib可以FooFactory用来请求构建,例如 a Foo7。在我的重构中,我让所有的FooX人都依赖FooFactory(而不是相反),如果makefile碰巧链接了他们,我会静态地注册他们自己。BarLib仍然依赖于FooFactory但只有在Foo7它被链接并因此静态注册到FooFactory.

我遇到了以下问题:

有一个特殊Foo14的 ,主要工厂文件FooFactory.CFooFactory一个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?或者它现在必须是一个全球性的生活在标题中?或者什么是替代解决方案?

4

1 回答 1

1

您不能从另一个文件引用匿名命名空间中定义的变量,请在此处查看更多信息:匿名命名空间

不必在共享标头中定义全局变量。为了允许从其他文件中引用,将它们定义为不在匿名命名空间中并且不是静态的就足够了。

于 2012-12-05T22:07:55.677 回答