首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++命名空间..。匿名命名空间合法吗?

C++命名空间..。匿名命名空间合法吗?
EN

Stack Overflow用户
提问于 2011-10-06 06:39:12
回答 3查看 650关注 0票数 5

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

就像这样。这段代码片段合法吗?

这合法吗?我能在任何地方引用Foo吗?还是只有特定的领域?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-06 06:43:15

这是合法的,您可以在同一个中的任何地方使用。

匿名命名空间是对变量使用static的标准规定方式,将其范围限制在相同的翻译单元。

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

第2段:

在名称空间范围内声明对象时,不推荐使用静态关键字,而未命名的命名空间提供了更好的替代方法。

更新:

正如@Matthieu M.在注释中正确指出的那样, C++11标准从C++03标准中删除了上面的引号,这意味着在命名空间范围中声明对象时static关键字不受欢迎,但是匿名或未命名命名空间仍然有效。

票数 9
EN

Stack Overflow用户

发布于 2011-10-06 06:43:35

这是合法的。您可以在翻译单元中的任何地方引用Foo

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

(未命名的命名空间定义)的行为就好像它被替换为

命名空间唯一{ /*空体*/ }使用命名空间唯一;命名空间唯一{命名空间-正文}

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

在名称空间范围内声明对象时,不推荐使用静态关键字;未命名的命名空间提供了更好的替代。。

票数 5
EN

Stack Overflow用户

发布于 2011-10-06 07:39:15

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

7.3.1.1未命名命名空间namespace.unnamed

1/是一个未命名的命名空间定义,它的行为似乎被替换为

代码语言:javascript
复制
inlineoptnamespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }

如果并且只有当内联出现在未命名名称空间定义中时,才会出现

,则转换单元中出现的所有唯一标识符都将被替换为相同的标识符,并且该标识符与整个程序中的所有其他标识符不同。

代码语言:javascript
复制
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示例]

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7670978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档