在C ++中,我知道如果我用static声明一个函数,它的名称只存在于声明/定义它的编译单元中:
static void MyFunction() {...}
此外,如果我在匿名命名空间中声明我的函数,它的名称将只存在于本地编译单元中:
namespace
{
void MyFunction() {...}
}
另外,我可以在匿名命名空间中使用static:
namespace
{
static void MyFunction() {...}
}
这些定义之间有什么区别吗?
谢谢
答案 0 :(得分:12)
是的,有区别。
首先,让我们准确一点,即使是迂腐: 这些名字无处不在。区别在于:
如果符号声明为static
(在命名空间范围内),则具有
内部联系,这意味着同一个名称在不同的
翻译单位是指不同的实体。
未命名的命名空间会生成名称为的命名空间 翻译单位独有的。符号仍然有外部 联系(如果它不是静态的),但你没有办法 在另一个翻译单元中命名。
主要区别在于模板。至少直到C ++ 11 (也许还有,我还没有检查过),任何实体都习惯了 实例化模板必须具有外部链接。所以你可以 没有在声明为static的东西上实例化模板,或者 这隐含着内部联系。