gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:37:08 28 4
gpt4 key购买 nike

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

static void MyFunction() {...}

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

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

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

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

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

谢谢

最佳答案

是的,有区别。

首先,让我们精确一点,甚至有点迂腐:这些名字无处不在。区别在于:

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

  • 一个未命名的命名空间生成一个名称为翻译单元独有。该符号仍然具有外部链接(前提是它不是静态的),但你没办法用另一个翻译单元命名。

主要区别在于模板。至少到 C++11(也许仍然如此,我还没有检查过),任何实体曾经实例化一个模板必须有外部链接。所以你可以不在声明为静态的东西上实例化模板,或者隐式地具有内部链接。

关于c++ - 在匿名命名空间内部和外部定义静态函数有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16864573/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com