为什么匿名命名空间中的函数/对象具有外部链接?

时间:2012-05-31 11:44:57

标签: c++

为什么匿名命名空间中定义的符号(函数和变量)与static关键字没有内部链接?如果一个函数在外面不可见/可访问,那么外部链接的原因是什么?

1 个答案:

答案 0 :(得分:37)

在C ++ 03中,禁止将具有内部链接的名称用作模板参数[*]。因此,未命名的命名空间中的大多数内容的名称都有外部链接,以允许它们与模板一起使用。您可以通过声明static来明确地在未命名的命名空间中给出名称内部链接,与命名或全局命名空间中的相同。

C ++ 11中的两个内容都发生了变化 - 默认情况下,未命名的名称空间中的名称具有内部链接(3.5 / 4),具有内部链接的名称可以用作模板参数。

[*]对于类型,它必须具有外部链接。对于对象和函数,如果地址用作模板参数,它必须具有外部链接,尽管例如可以将const的用作模板参数带内部联系的整数。