我正在重构一个相当大的代码库。在过去,有两个库:FooFactory
和 BarLib
。 BarLib
依赖于 FooFactory
,后者又依赖于很多 Foo1
、Foo2
、Foo3
代码等...构建时,FooFactory
拉入所有 Foo
依赖项,然后 BarLib
可以使用 FooFactory
请求构造一个 Foo7
。在我的重构中,我让所有 FooX
人员都依赖于 FooFactory
(而不是相反),如果 makefile 碰巧链接了它们,我会静态注册它们自己。 BarLib
仍然依赖于 FooFactory
但只有当它被链接并因此静态注册到 FooFactory
时才会成功创建 Foo7
>.
我遇到了以下问题:
有一个特殊的Foo14
,FooFactory
中的主工厂文件FooFactory.C
用BarLib
集。它的工作方式是 FooFactory.H
在 .C
文件中公开了一个名为 setString(const std::string&);
的全局函数它在匿名命名空间中有一个 std::string theString
变量。然后 BarLib
中的方法可能会也可能不会使用此函数来设置此字符串。而在 FooFactory.C
的语料库中,这个字符串在 Foo14
的构建过程中被检查。
问题是,随着依赖关系的逆转,Foo
家伙的所有构造代码都保存在各自的库中,并且只有在静态注册后才会被调用。我没有将此 std::string
传递给 Foo14
的简单方法,因为它遵守为构造 Foo
传递的参数的通用接口(interface).如果我将字符串 theString
放在 Foo14.C
中,那么这将强制 BarLib
依赖于 Foo14
以便设置它...所以我想知道我是否可以将它保留在 FooFactory.C
中,但在 Foo14
中将其声明为 extern 并使用它。即使 theString
位于 FooFactory.C
的匿名命名空间中,这是否有效?或者它现在必须是标题中的全局生活吗?或者有什么替代解决方案?
最佳答案
您不能从另一个文件引用匿名命名空间中定义的变量,请在此处查看更多信息:anonymous namespace
不必在共享 header 中定义全局变量。为了允许从其他文件中引用,将它们定义为不在匿名命名空间中而不是静态的就足够了。
关于c++ - extern 可以解决这个问题还是我可以通过其他什么方式解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731212/