外部人员可以解决这个问题,还是以其他方式解决这个问题?

时间:2012-12-05 19:49:14

标签: c++ global-variables extern

我正在重构一个相当大的代码库。以旧方式,有两个库:FooFactoryBarLibBarLib取决于FooFactoryFoo1依赖于大量Foo2Foo3FooFactory代码等......构建时Foo引入所有BarLib个依赖项,然后FooFactory可以使用Foo7来请求构建FooX。在我的重构中,我让所有FooFactory人依赖于BarLib(而不是相反),并且如果makefile恰好链接它们,则静态注册自己。 FooFactory仍取决于Foo7,但只有在FooFactory被链接并因此静态注册到Foo14时才能成功创建FooFactory.C

我遇到了以下问题:

有一个特殊的FooFactoryBarLib中的主工厂文件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}}的匿名命名空间中,这是否也能正常工作?或者它现在必须成为一个全球生活在标题?或者什么是替代解决方案?

1 个答案:

答案 0 :(得分:1)

您无法从另一个文件引用匿名命名空间中定义的变量,请参阅此处:anonymous namespace

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