匿名命名空间和 static 声明的区别

一、本质区别
static关键字声 明的符号有内部链接属性,而匿名命名空间中声明的符号有外部链接属性。

二、static

C和C++中每一个源文件(.c, .cpp)都可以单独编译成一个目标文件(.o),之后通过链接器把这些目标文件链接起来,形成最后的可执行文件或者库文件。也就是说某个源文件 a.cpp中用到的符号s(函数,全局变量等)可能是在另一个源文件b.cpp中定义的, 在 a.cpp中只要给出相应的声明就可以了。为了让链接器可以找到符号s的定义,b.o 必须提供它定义的所有可链接的符号。b.o只会提供具有外部链接熟悉的符号给链接器使 用,如果一个符号在声明中加了static 关键字,那么它的链接属性变成了内部链接,也 就不会暴露给链接器进行链接,这样一来它也就只能被文件内部看见了。

三、匿名名字空间

匿名名字空间并不是真的没有名字,只不过这个名字只有编译器知道而已,下面的代码

namespace {
struct Widget {};
} // namespace

实际上经过编译器的处理之后可能是下面这个样子:

namespace some_unique_name_compiler_generated {}    // 编译器生成一个唯一的名字
using namespace some_unique_name_compiler_generated;

namespace some_unique_name_compiler_generated {
struct Widget {};
}

所以实际上 Widget 类完整的修饰应该是:

some_unique_name_compiler_generated::Widget;

因为它没有 static 的修饰,所以它具有外部连接,但是因为命名空间的名字是编译器生 成的,外部无从知晓,所以Widget这个符号只有编译单元的内部才能看见。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值