16

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

4

1 回答 1

37

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

这两件事在 C++11 中都发生了变化——未命名命名空间中的名称默认具有内部链接 (3.5/4),并且具有内部链接的名称可以用作模板参数。

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

于 2012-05-31T11:53:45.777 回答