未命名的命名空间合法吗?

发布于 2024-12-08 07:53:40 字数 170 浏览 0 评论 0原文

命名空间 { int Foo (int a); }

这段代码片段合法吗?如果是这样,我可以在任何地方引用 Foo,还是只能在某个域中引用 Foo?

namespace { int Foo (int a); }

Is this code snippet legal? If so, can I reference Foo in anywhere, or only in a certain domain?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

冰雪之触 2024-12-15 07:53:40

这是合法的,您可以在同一个 翻译单元

匿名命名空间是对变量表示静态的标准规定方式,以将其范围限制在同一翻译单元内。

C++03 标准第 7.3.1.1 节未命名命名空间

第 2 段:

在命名空间范围内声明对象时,不建议使用 static 关键字,未命名命名空间提供了更好的替代方案。


更新:
正如 @Matthieu M. 在评论中正确指出的那样,他的回答 C++11 标准从 C++03 标准中删除了上述引用,这意味着 static 关键字不是在命名空间范围内声明对象时已弃用,但匿名或未命名命名空间仍然有效。

It is legal, You can use Foo anywhere in the same Translation Unit.

Anonymous namespace is the standard prescribed way of saying static on variables to limit their scope to the same Translation unit.

C++03 Standard section 7.3.1.1 Unnamed namespaces

para 2:

The use of the static keyword is deprecated when declaring objects in a namespace scope, the unnamed-namespace provides a superior alternative.


Update:
As @Matthieu M. correctly points out in the comments, and his answer The C++11 Standard removed the above quote from C++03 Standard, which implies that the static keyword is not deprecated when declaring objects in a namespace scope, Anonymous or Unnamed namespaces are still valid nevertheless.

柏林苍穹下 2024-12-15 07:53:40

这是合法的。您可以在翻译单元内的任何位置引用 Foo

来自 C++03 标准,第 7.3.1.1 节:

未命名的命名空间定义的行为就像被替换了

命名空间唯一 { /* 空主体 */ } 使用命名空间唯一;
命名空间唯一 { 命名空间主体 } 

其中所有出现的unique
翻译单元被相同的标识符替换,并且这个
标识符与整个程序中的所有其他标识符不同。

在声明对象时不推荐使用 static 关键字
命名空间范围;未命名的命名空间提供了优越的
替代方案。

This is legal. You can reference Foo anywhere inside the translation-unit.

From the C++03-standard, Section 7.3.1.1:

An unnamed-namespace-definition behaves as if it were replaced by

namespace unique { /* empty body */ } using namespace unique;
namespace unique { namespace-body } 

where all occurrences of unique in
a translation unit are replaced by the same identifier and this
identifier differs from all other identifiers in the entire program.

The use of the static keyword is deprecated when declaring objects in
a namespace scope; the unnamed-namespace provides a superior
alternative.

梦萦几度 2024-12-15 07:53:40

C++11 标准中的定义略有变化:

7.3.1.1 未命名命名空间 [namespace.unnamed]

1/ 未命名命名空间定义的行为就像被替换为

inlineoptnamespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

其中,当且仅当 inline 出现在未命名命名空间定义中时,翻译单元中所有出现的 unique 都会被相同的标识符替换,并且该标识符与整个程序中的所有其他标识符不同。94 < em>[ 示例:

namespace { int i; } // unique ::i
void f() { i++; } // unique ::i++

namespace A {
  namespace {
    int i; // A:: unique ::i
    int j; // A:: unique ::j
  }
  void g() { i++; } // A:: unique ::i++
}

using namespace A;

void h() {
  i++; // error: unique ::i or A:: unique ::i
  A::i++; // A:: unique ::i
  j++; // A:: unique ::j
}

—结束示例]

The definition changed slightly in the C++11 Standard:

7.3.1.1 Unnamed namespaces [namespace.unnamed]

1/ An unnamed-namespace-definition behaves as if it were replaced by

inlineoptnamespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

where inline appears if and only if it appears in the unnamed-namespace-definition, all occurrences of unique in a translation unit are replaced by the same identifier, and this identifier differs from all other identifiers in the entire program.94 [ Example:

namespace { int i; } // unique ::i
void f() { i++; } // unique ::i++

namespace A {
  namespace {
    int i; // A:: unique ::i
    int j; // A:: unique ::j
  }
  void g() { i++; } // A:: unique ::i++
}

using namespace A;

void h() {
  i++; // error: unique ::i or A:: unique ::i
  A::i++; // A:: unique ::i
  j++; // A:: unique ::j
}

—end example ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文