Static and anonymous namespace
Possible Duplicate:
Unnamed/anonymous namespaces vs. static functions
这是完全多余的,还是有理由这样做?
1 2 3 4 5 | namespace { static void f() { ... } } |
在我看来,它是多余的——要么被声明为静态的,要么在匿名名称空间中,这意味着它有内部链接。
3.3.5/3:
A name having namespace scope (3.3.6) has internal linkage if it is the name of:
— a variable, function or function template that is explicitly declared static;
3.3.5/4:
[...] An unnamed namespace or a namespace declared directly or indirectly within an unnamed namespace has internal linkage. [...] A name having namespace scope that has not
been given internal linkage above has the same linkage as the enclosing namespace if it is the name of
— a variable; or
— a function; or
所以,就像现在一样,它有内部链接,因为它被显式声明为静态的。如果不是显式声明为static,则它将具有内部链接,因为它是在未命名的命名空间中声明的。不管怎样,效果都一样。
注意,这里我专门回答一个函数——有一些模糊的情况,在处理一个类型的名称(例如,class/struct/union)时会有不同之处,但是我不知道在处理一个函数的情况时会有什么应用。
至于内部联系真正意味着什么,这是其中一个地方,标准实际上是非常直接和明确的。最好引用这三种可能性的定义(§3.5/2):
请注意,上面的斜体字与标准中的斜体字相匹配,也就是说,这些句子定义了标准其余部分中这些短语的含义。