在C++中,我知道如果我用static声明一个函数,它的名称只存在于声明/定义它的编译单元中:
static void MyFunction() {...}
Run Code Online (Sandbox Code Playgroud)
此外,如果我在匿名命名空间内声明我的函数,它的名称将只存在于本地编译单元中:
namespace
{
void MyFunction() {...}
}
Run Code Online (Sandbox Code Playgroud)
另外,我可以在匿名命名空间内使用static:
namespace
{
static void MyFunction() {...}
}
Run Code Online (Sandbox Code Playgroud)
这些定义之间有什么区别吗?
谢谢
Jam*_*nze 12
是,有一点不同.
首先,让我们确切地说,即使是迂腐:这些名字随处可见.区别是:
如果声明符号static(在命名空间范围内),则它具有内部链接,这意味着不同翻译单元中的相同名称指的是不同的实体.
未命名的命名空间生成名称空间,其名称对于转换单元是唯一的.符号仍然具有外部链接(前提是它不是静态的),但是你无法在另一个翻译单元中命名它.
主要区别涉及模板.至少在C++ 11之前(可能还有,我还没有检查过),用于实例化模板的任何实体都必须具有外部链接.因此,您无法在声明为static的内容上实例化模板,或者隐式具有内部链接.