1

我在理解编译器的投诉时遇到问题:

namespace
{
}

inline namespace
{
}

gcc 说

必须在初始定义时指定内联命名空间

MSVC 说明了标题中的内容。

我的混乱来自我的期望,即两个后续的匿名命名空间应该被视为一个不相关的新空间的新声明,但编译器抱怨它们以某种方式链接,就像它试图用第二个扩展第一个命名空间一样。

https://godbolt.org/z/rwAYLg

4

1 回答 1

1

翻译单元中的每个匿名命名空间都是同一个命名空间。

为了:

namespace
{
  struct F {};
}

namespace
{
  struct G {};
}

编译器有效地生成如下内容:

namespace __mytranslation_unit_anonymous_namespace
{
  struct F {};
}

namespace __mytranslation_unit_anonymous_namespace
{
  struct G {};
}

F并且G都在同一个命名空间中。如果您将代码复制到新的翻译单元,编译器将生成一个新的命名空间名称,例如__mytranslation_unit2_anonymous_namespace.

于 2020-06-10T07:13:03.847 回答