在匿名名称空间内部和外部定义静态函数之间有什么区别吗? 在C++中,我知道如果用静态声明函数,它的名称只存在于声明/定义的编译单元: static void MyFunction() {...}

在匿名名称空间内部和外部定义静态函数之间有什么区别吗? 在C++中,我知道如果用静态声明函数,它的名称只存在于声明/定义的编译单元: static void MyFunction() {...},c++,C++,此外,如果我在匿名命名空间中声明我的函数,则其名称将仅存在于本地编译单元中: namespace { void MyFunction() {...} } 此外,我还可以在匿名命名空间中使用static: namespace { static void MyFunction() {...} } 这些定义之间有什么区别吗 谢谢是的,有区别 首先,让我们准确地说,甚至到了迂腐的地步: 名字无处不在。区别在于: 如果一个符号被声明为静态的(在名称空间范围内),则它具有 内部链接,这

此外,如果我在匿名命名空间中声明我的函数,则其名称将仅存在于本地编译单元中:

namespace
{
    void MyFunction() {...}
}
此外,我还可以在匿名命名空间中使用static:

namespace
{
    static void MyFunction() {...}
}
这些定义之间有什么区别吗


谢谢

是的,有区别

首先,让我们准确地说,甚至到了迂腐的地步: 名字无处不在。区别在于:

  • 如果一个符号被声明为静态的(在名称空间范围内),则它具有 内部链接,这意味着相同的名称在不同的 翻译单位是指不同的实体

  • 未命名的命名空间生成名称为的命名空间 翻译单位特有的。符号仍然具有外部属性 链接(前提是它不是静态的),但您无法 用另一个翻译单位来命名

主要区别在于模板。至少在C++11之前 (也许我还没有查过),任何实体 实例化模板必须具有外部链接。所以你可以 不在声明为静态的对象上实例化模板,或
其中隐含了内部链接。

@catscradel几乎相同,但不要讨论匿名内部的静态用法。是的,C++11删除了模板需要外部链接的要求。这很有帮助,因为我认为lambda表达式的类型没有链接。@Ascheppler即使没有lambda也很有帮助,但当然,lambda打开了一个全新的可能性前景。