c++ - extern 可以解决这个问题还是我可以通过其他什么方式解决这个问题?

标签 c++ global-variables extern

我正在重构一个相当大的代码库。在过去,有两个库:FooFactoryBarLibBarLib 依赖于 FooFactory,后者又依赖于很多 Foo1Foo2Foo3 代码等...构建时,FooFactory 拉入所有 Foo 依赖项,然后 BarLib 可以使用 FooFactory 请求构造一个 Foo7。在我的重构中,我让所有 FooX 人员都依赖于 FooFactory(而不是相反),如果 makefile 碰巧链接了它们,我会静态注册它们自己。 BarLib 仍然依赖于 FooFactory 但只有当它被链接并因此静态注册到 FooFactory 时才会成功创建 Foo7 >.

我遇到了以下问题:

有一个特殊的Foo14FooFactory中的主工厂文件FooFactory.CBarLib 集。它的工作方式是 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/

相关文章:

c++ - 了解 SFINAE

c++ - 管道实现问题

php - 使所有变量成为全局变量,PHP

javascript - 需要根据条件隐藏选定的元素

c++ - 为什么在函数内的 extern 上提供显式初始化程序不会覆盖 extern?

c - 外部声明和全局范围

c++ - 使用具有固定宽度、左对齐字段和串联的 sprintf

c# - 如何在 WPF 中保存全局应用程序变量?

c - 编译器如何以及为什么将 extern 函数替换为空函数?

c++ - 如何复制文件的二进制数据