静态和匿名命名空间

12

4
看那个,它回答了一切:未命名/匿名命名空间 vs. 静态函数 - pbhd
@phbd 那里有一条注释,指出未命名的命名空间仍然具有外部链接。你知道/能解释一下这是什么意思吗? - Baruch
@baruch:请看我的回答——正如标准中的引用所明确的那样,这意味着发表该评论的人是错误的。 - Jerry Coffin
1个回答

4
对我来说看起来有些冗余——无论是明确声明为静态的还是在匿名命名空间中,都意味着它具有内部链接性。
§3.5/3:
名称具有命名空间作用域(3.3.6)时,如果它是以下内容之一的名称,则具有内部链接性:
— 明确声明为静态的变量、函数或函数模板;
§3.5/4:
[...]未命名命名空间或直接或间接声明在未命名命名空间中的命名空间具有内部链接性。[...]具有未获得上述内部链接性的命名空间作用域名称,如果它是以下内容的名称,则具有与封闭命名空间相同的链接性:
— 变量;或
— 函数;或
所以,就目前而言,它具有内部链接性,因为它被明确声明为静态。如果没有明确声明为静态,则它具有内部链接性,因为它是在未命名命名空间中声明的。两种方式都产生了相同的效果。
请注意,此处我是特别回答关于函数的问题——有一些少数的晦涩情况,当您处理类型的名称(例如,类/结构体/联合体)时,存在不同之处,但是在处理函数名称的情况下,我不知道任何这样的情况。
就内部链接性的实际含义而言,这是标准实际上非常明确和清晰的地方之一。最好引用三种可能性的定义(§3.5/2):
1. 当名称具有外部链接性时,它表示的实体可以由其他翻译单元或同一翻译单元中其他作用域的名称引用。
2. 当名称具有内部链接性时,它表示的实体可以由同一翻译单元中其他作用域的名称引用。
3. 当名称没有链接性时,它表示的实体不能由其他作用域中的名称引用。
请注意,上面的斜体匹配标准中的斜体,这是其表明这些句子在整个标准中定义了哪些短语的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接