在匿名命名空间和外部定义静态函数之间有什么区别吗?

时间:2013-05-31 19:32:15

标签: c++

在C ++中,我知道如果我用static声明一个函数,它的名称只存在于声明/定义它的编译单元中:

static void MyFunction() {...}

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

namespace
{
    void MyFunction() {...}
}

另外,我可以在匿名命名空间中使用static:

namespace
{
    static void MyFunction() {...}
}

这些定义之间有什么区别吗?

谢谢

1 个答案:

答案 0 :(得分:12)

是的,有区别。

首先,让我们准确一点,即使是迂腐: 这些名字无处不在。区别在于:

  • 如果符号声明为static(在命名空间范围内),则具有 内部联系,这意味着同一个名称在不同的 翻译单位是指不同的实体。

  • 未命名的命名空间会生成名称为的命名空间 翻译单位独有的。符号仍然有外部 联系(如果它不是静态的),但你没有办法 在另一个翻译单元中命名。

主要区别在于模板。至少直到C ++ 11 (也许还有,我还没有检查过),任何实体都习惯了 实例化模板必须具有外部链接。所以你可以 没有在声明为static的东西上实例化模板,或者 这隐含着内部联系。