extern可以解决这个问题吗,或者我可以通过其他方法解决这个问题吗?



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

我遇到了以下问题:

有一个特殊的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 并使用它。即使theStringFooFactory.C的匿名命名空间中,这也能工作吗?还是现在必须成为标题中的全球生活?或者什么是替代解决方案?

您不能从另一个文件引用匿名命名空间中定义的变量,请参阅此处的详细信息: 匿名命名空间

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

相关内容

  • 没有找到相关文章

最新更新