我正在重构一个相当大的代码库。在旧的方法中,有两个库:FooFactory和BarLib。 BarLib取决于FooFactory,而Foo1则取决于很多Foo2,Foo3,FooFactory代码等。构建时,Foo提取所有BarLib依赖项,然后可以使用FooFactory请求构造Foo7。在重构过程中,我使所有FooX家伙都依赖FooFactory(而不是相反),并且在makefile恰巧链接它们时将其静态注册。 BarLib仍依赖于FooFactory,但只有链接并因此静态注册到Foo7的情况下,成功创建FooFactory。我遇到以下问题:有一个特殊的Foo14,FooFactory.C中的主工厂文件FooFactory用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中,但在将其声明为extern并加以利用。即使Foo14在theString的匿名命名空间中,这也可以吗?还是现在必须在页眉中生存?或什么是替代解决方案? (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您不能从另一个文件引用匿名命名空间中定义的变量,请参见此处:anonymous namespace全局不必在共享头中定义。为了允许从其他文件中进行引用,仅在不使用匿名名称空间且不将其定义为静态文件的情况下定义它们就足够了。 (adsbygoogle = window.adsbygoogle || []).push({}); 10-08 11:51