静态和匿名命名空间
Static and anonymous namespace
可能重复:
未命名/匿名命名空间与静态函数
这是完全多余的吗,还是有理由这样做?
namespace {
static void f() {
...
}
}
对我来说,它看起来是多余的——要么被声明为静态,要么在匿名命名空间中,这意味着它有内部链接。
§3.5/3:
如果名称空间作用域(3.3.6)是以下项的名称,则该名称具有内部链接:
-显式声明为静态的变量、函数或函数模板;
§3.5/4:
[…]未命名命名空间或在未命名命名空间中直接或间接声明的命名空间具有内部链接。[…]名称空间作用域没有如果是变量
的名称,则上面给定的内部链接与封闭命名空间具有相同的链接;或
-一个函数;或
因此,正如现在一样,它具有内部链接,因为它被明确声明为静态。如果它没有明确声明为静态,那么它将具有内部链接,因为它是在未命名的命名空间中声明的。无论哪种方式,效果都一样。
请注意,我在这里专门回答一个函数——在处理类型名称(例如,类/结构/联合)时,有一些模糊的情况是有区别的,但我不知道有什么适用于函数的情况。
就内部联系的真正含义而言,这是标准非常直接和明确的地方之一。最好引用所有三种可能性的定义(§3.5/2):
- 当一个名称具有外部链接时,它所表示的实体可以由其他翻译单元的作用域或同一翻译单元的其他作用域的名称引用
- 当一个名称具有内部链接时,它所表示的实体可以由同一翻译单元中其他作用域的名称引用
- 当一个名称没有链接时,它所表示的实体不能被其他作用域的名称引用
请注意,上面的斜体字与标准中的斜体字相匹配,这就是它的说法,即这些句子定义了这些短语在标准其余部分的含义。
相关文章:
- 如何通过命名空间调用非静态方法
- 匿名命名空间中的const与静态const
- 使用匿名命名空间中的函数或另一个文件中的静态函数不应该出错吗?
- 将typeID转换为静态成员访问(C )的命名空间
- 为什么主可执行文件和 dlopen 加载的共享库共享命名空间静态变量的一个副本?
- 获取封装在命名空间中的静态变量地址
- 静态和匿名命名空间
- C++命名空间中静态函数的链接
- 我应该使用静态还是命名空间
- 使用静态成员充当带有模板的命名空间:坏主意
- 匿名命名空间中的静态结构
- 静态函数中的命名空间
- 如何将类的静态方法引入命名空间
- 对静态类成员使用命名空间
- 命名空间内的 extern const 和静态 const 类成员之间的区别
- C++Singelton类与命名空间与公共静态变量
- 我可以沙盒一个使用静态数据的命名空间吗
- 工厂函数作为类或命名空间中的静态成员
- 静态成员变量和命名空间变量有什么区别?
- 命名空间“静态”是否仍在 C++11 中弃用