回答
这是合法的,您可以在同一个Translation Unit的任何地方使用Foo
。
匿名命名空间是说对变量static
其范围限制在同一翻译单位的标准所规定的方式。
C++ 03标准节7.3.1.1未命名空间
第2段:
使用static关键字的命名空间中的范围声明对象时已被弃用,无名的命名空间提供了一个更好的选择
更新:
作为@Matthieu M.正确地指出中的注释和his answer的C++ 11标准从C++ 03标准,这意味着除去上述报价在命名空间范围内声明对象时不推荐使用static
关键字,但匿名或未命名的名称空间仍然有效。
我的答案略有不同,但更正确一点,我认为;) –
@BjörnPollex:啊,这是我的第二次编辑使我们的答案相同lol –
现在我们都添加了标准报价:) –
这是合法的。您可以在翻译单元的任何地方参考Foo
。
从C++ 03标准,第7.3.1.1:
一个未命名的名称空间定义的行为就好像它是由
namespace unique { /* empty body */ } using namespace unique; namespace unique { namespace-body }
替换其中的
unique
所有出现 翻译单元由相同的标识符替换和本 标识符从在整个程序中所有其他标识符不同。使用static关键字的在 一个命名空间声明范围的对象时不推荐使用; unnamed命名空间提供了一个优越的替代选项 。
'unnamed-namespace-definition的行为就好像它被替换为...' 。我恳求在这里有所不同。如果没有命名'namespace',你可以在里面声明/定义一个变量。但是,如果命名空间不正常(因为它会导致多个符号链接器错误)。所以两者都没有相同的效果。 – iammilind
@iammilind:由于所有翻译单元的“唯一”(这是该名称空间的名称)是不同的,因此永远不会有多重定义的符号。此外,这是一个标准的引用,所以如果你不同意,请与委员会讨论;) –
好吧,我认为'unique'只是一个名字。我不知道标准委员会会把这种令人困惑的例子:))。可能是'命名空间
定义略微在C++ 11标准改变:
7.3.1.1未命名空间[命名空间。无名]
1/一个未命名的名称空间定义的行为就好像它是由
inlineoptnamespace unique { /* empty body */ }
using namespace unique ;
namespace unique { namespace-body }
其中内嵌出现替换当且仅当它出现在未命名-namespace-定义中,翻译单元中唯一的所有事件被相同的标识符替代,并且该标识符不同于整个程序中的所有其他标识符.94 [例如:
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
}
末端示例]
- 1. 匿名命名空间
- 2. 从匿名命名空间调用命名命名空间中的函数
- 3. C++组合命名空间
- 4. 嵌套的匿名命名空间?
- 5. 命名空间内的匿名函数
- 6. 联动匿名命名空间内的符号的规则命名空间
- 7. 重命名命名空间
- 8. C#完全限定的命名空间与小命名空间
- 9. 命名空间
- 10. 命名空间
- 11. System.Collections是“System命名空间的命名空间”吗?
- 12. XSD命名空间到C#命名空间
- 13. C#中的命名空间#
- 14. c中的命名空间#
- 15. c中的命名空间#
- 16. C++中的命名空间
- 17. 导入命名空间无法找到命名空间
- 18. 命名空间中不存在命名空间名称'Notify'Twilio.Rest
- 19. 加入不同命名空间的命名空间房间
- 20. 命名空间的用法
- 21. C++命名空间问题
- 22. XML命名空间,C#
- 23. C++命名空间trobles
- 24. C#DataSet命名空间
- 25. C#命名空间搜索
- 26. C++宏和命名空间
- 27. C++ - 类与命名空间
- 28. C++命名空间帮助
- 29. C#命名空间指南
- 30. C++命名空间导出
[在静态具名命名空间的优势的可能重复?](http://stackoverflow.com/questions/4422507/superiority-of- unnamed-namespace-over-static) – Nawaz
这是合法的,但意味着与常规名称空间不同。 :) – jalf