C++的匿名命名空间
首先这篇文章很有用
当声明命名空间时的名称为空时,则该命名空间为匿名命名空间(unnamed namespace)。匿名的空间是C++用于替代使用static定义作用域为本编译单元的全局函数或全局变量的一种新的替代方式
#include <iostream>
using namespace std;
namespace{ int i = 256; }
namespace ns
{
namespace { int i = 128; }
void func(void)
{
cout<<"ns::func :" <<endl;
cout<<"\t::i="<<::i<<endl;
cout<<"\tns::i="<<i<<endl;
}
}
int main(void )
{
cout<<::i<<endl;
cout<<"i="<<i<<endl;
cout<<"ns::i="<<ns::i<<endl;
ns::func();
return 0;
}
运算结果
我觉得这个例子挺有趣的,也有点疑惑。
main函数里面的第一个cout
,按照我的理解应该是默认命名空间的i了,但是这里默认明明空间里面没有i,但是默认命名空间里面有个匿名命名空间,所以编译器就直接到匿名命名空间里面去找i去了,所以i=256
main函数里面的第二个cout
,我觉得这样跟第一个一样,没区别
main函数里面的第三个cout
,很明显是ns
namespace里面的i,但是在ns
里面没有i,只能继续往里面找,所以里面的匿名命名空间里面的i=128
main函数里面最后一个
,func里面的第二句cout
,他要的是默认命名空间的i,然后外面的默认命名空间里面的匿名命名空间有i=256,所以i=256,然后最后找的就是ns里面的匿名命名空间的i,所以i=128
其实就是匿名命名空间可以有很多个,这里的很多个是指的是在一个命名空间里面可以有一个,你想有多几个就多声明几个命名空间。
而匿名命名空间的用法跟static有点像的,但是它的功能比static更强,具体还是看一下刚开始的那一篇文章,里面的例子都撸一遍,脑子过一遍,对这些概念就会清楚一点了。