为什么在匿名 namespace 中定义的符号(函数和变量)不像static关键字那样具有内部链接?如果某个功能在外部不可见/不可访问,那么建立外部链接的原因是什么?

最佳答案

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

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

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

09-06 15:46