8

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

static void MyFunction() {...}

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

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

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

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

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

谢谢

4

1 回答 1

12

是,有一点不同。

首先,让我们准确一点,甚至到了迂腐的程度:名字无处不在。区别在于:

  • 如果一个符号被声明static(在命名空间范围内),它具有内部链接,这意味着不同翻译单元中的相同名称引用不同的实体。

  • 未命名的命名空间会生成一个名称对于翻译单元来说是唯一的命名空间。该符号仍然具有外部链接(前提是它不是静态的),但您无法在另一个翻译单元中命名它。

主要区别在于模板。至少在 C++11 之前(也许我还没有检查过),任何用于实例化模板的实体都必须具有外部链接。因此,您无法在声明为静态或隐式具有内部链接的对象上实例化模板。

于 2013-05-31T19:45:25.457 回答