这完全是多余的,还是有理由这样做?
namespace {
static void f() {
...
}
}
答案 0 :(得分:3)
对我来说这看起来多余 - 要么被声明为静态,要么是在匿名命名空间中意味着它具有内部链接。
§3.5/ 3:
具有命名空间范围(3.3.6)的名称具有内部链接,如果它的名称为:
- 显式声明为static的变量,函数或函数模板;
§3.5/ 4:
[...]未命名的命名空间或在未命名的命名空间中直接或间接声明的命名空间具有内部链接。 [...]具有名称空间范围但没有的名称 上面给出的内部链接与封闭命名空间具有相同的链接,如果它是
的名称 - 一个变量;或
- 一个功能;或
因此,就像现在一样,它具有内部链接,因为它显式声明为静态。如果没有显式声明为static,它将具有内部链接,因为它在未命名的命名空间中声明。无论如何都有同样的效果。
请注意,这里我特意回复了一个函数 - 有一些很少的模糊的情况,当你处理一个类型的名称时会有区别(例如,类/结构) / union),但我不知道任何适用于函数的东西。
就内部联系的真正含义而言,标准实际上非常直接和清晰。最好引用所有三种可能性的定义(§3.5/ 2):
请注意,上面的斜体符合标准中的斜体,这就是说这些句子定义了这些短语在标准的其余部分中的含义。