C++的一个特性是能够创建未命名(匿名)命名空间,如下所示:
namespace {
int cannotAccessOutsideThisFile() { ... }
} // namespace
Run Code Online (Sandbox Code Playgroud)
您会认为这样的功能是无用的 - 因为您无法指定命名空间的名称,所以无法从外部访问其中的任何内容.但是这些未命名的命名空间可以在它们创建的文件中访问,就好像你有一个隐含的using子句.
我的问题是,为什么或何时使用静态函数会更好?或者他们基本上是两种做同样事情的方式?
未命名的命名空间如何优于static关键字?
C++标准中的$ 7.3.1.1/2节描述如下:
在声明命名空间作用域中的对象时,不推荐使用static关键字; unnamed-namespace提供了一个更好的选择.
我不明白为什么一个未命名的命名空间被认为是一个更好的选择?理由是什么?我已经知道标准的内容很长一段时间,但我从未认真考虑过,即使我回答这个问题:未命名的命名空间优于静态?
它是否被认为是优越的,因为它也可以应用于用户定义的类型,正如我在回答中所描述的那样?还是有其他原因,我不知道?我问这个问题,特别是因为这是我在答案中的推理,而标准可能会考虑其他因素.
在C++中,可以static在翻译单元中使用关键字来影响符号的可见性(变量或函数声明).
在n3092,这被弃用了:
附件D.2 [depr.static]
在命名空间范围内声明对象时,不推荐使用static关键字(见3.3.6).
在n3225中,这已被删除.
它确实强调,为了与C兼容(以及将C程序编译为C++的能力),弃用令人讨厌.但是,直接将C程序编译为C++本身就是一种令人沮丧的经历,所以我不确定它是否值得考虑.
有谁知道为什么它被改变了?
可能重复:
静态关键字的弃用...不再?
在C++ 2003中,static不推荐使用namespace- :
[C++03: 7.3.1.1/2]:static在声明命名空间范围内的对象时,不推荐使用该关键字(见附录D); 所述 未命名的命名空间提供了一个更好的选择.
我无法找到C++ 2011中存在任何此类子句的位置(建议不引用),并且7.1.1似乎没有禁止命名空间 - static(如果有的话,这表明该功能最终已从语言中删除); 然而,这两个案例都没有列入C.2(这表明2003年和2011年之间存在重大差异).
名称空间是否static未被提及?
在C++中,将函数或变量放在匿名命名空间中会使其内部链接,即与static在文件级别上声明它相同,但却是惯用的C++.
普通命名空间中的匿名命名空间怎么样?它仍然保证内部联系吗?
// foo.cpp
void func1() {
// external linkage
}
static void func2() {
// internal linkage
}
namespace {
void func3() {
// internal linkage
}
}
namespace ns1 {
void func4() {
// external linkage
}
namespace {
void func3() {
// still internal linkage?
}
}
}
Run Code Online (Sandbox Code Playgroud)