嵌套的命名空间
其作用是改进库中代码的组织架构,防止库中命名冲突
::name 表示访问最外层的命名结构(包含自己所在最外层结构)
省略::表示访问自身命名结构中的内容
示例1-嵌套命名例子
#include <stdlib.h>
#include <iostream>
namespace detail
{
const int i = 99;
}
const int j = 8;
namespace ant
{
namespace blas
{
const int i = 0;
}
const int i = 3;
const int j = 9;
namespace detail
{
const int i = 33;
const int j = 10;
void test ()
{
std::cout << "j:" << j << std::endl; // 值为10,访问最内层namespace的数据,如果内层namespace不存在变量j,则访问外层;如果外层不存在该变量,则访问全局变量j
std::cout << "::detail::i" <<::detail::i << std::endl; // 值为99,访问外层detail中的变量i
std::cout << "detail::i" << detail::i << std::endl; // 值为33,访问detail下的变量i
std::cout << "::ant::blas::i" <<::ant::blas::i << std::endl; // 值为0,访问ant下blas中的变量i
std::cout << "ant::blas::i" <<ant::blas::i << std::endl; // 值为0,访问ant下blas中的变量i
std::cout << "blas::i" << blas::i << std::endl; // 值为0,访问内层blas下的变量i
// std::cout<<"blas::j"<<blas::j<<std::endl; // 报错,内层blas不存在变量i
// std::cout<<"::blas::i"<<::blas::i<<std::endl; // 报错,外层不存在命名空间blas
std::cout << "ant::i" << ant::i << std::endl; // 值为3,访问当前ant下的i
}
}
}
using namespace std;
int main ()
{
ant::detail::test();
return 0;
}
执行结果
示例2-命名名称相同但变量不同
#include <stdlib.h>
#include <iostream>
namespace detail
{
const int i = 99;
}
const int j = 8;
namespace ant
{
namespace blas
{
const int j = 99; // 不能定义i,反正会发生与下面命名空间冲突
}
namespace test
{
const int i = 88;
}
}
namespace ant // 相同的名称,不同的内容
{
namespace blas // 相同的名称,不同的内容
{
const int i = 0;
}
const int i = 3;
const int j = 9;
namespace detail
{
const int i = 33;
const int j = 10;
void test ()
{
std::cout << "ant::i" << ant::i << std::endl;
}
}
}
using namespace std;
int main ()
{
ant::detail::test();
std::cout << ant::test::i << std::endl;
std::cout << ant::blas::j << std::endl;
return 0;
}
答案:
匿名的命名空间
匿名的命名空间可以在给定文件中不连续,但不能跨越多个文件;定义的名字只在本文件中可见。
匿名的命名空间用于声明局部于文件的实体,在匿名的命名空间中定义的变量在程序开始时创建,在程序结束时一直存在。
匿名的命名空间中定义的名字可直接使用,没有完全限定名。
匿名的命名空间中定义的名字可以在定义该命名空间所在的作用域中可见,如果在文件的最外层作用域中定义匿名的命名空间,那么该匿名的命名空间中的名字必须与全局作用域中的名字不同。
示例1 - 匿名命名空间的使用
#include <stdlib.h>
#include <iostream>
using namespace std;
namespace local
{
namespace
{
int i = 5;
}
}
int main ()
{
cout << local::i << endl; // 值为5, 因为main不是位于namespace结构中,所有可以省略::
cout << ::local::i << endl; // 值为5
return 0;
}
示例2-匿名命名空间变量i与全局变量i冲突
int i;
namespace {
int i;
}
int main ()
{
i = 0; // 报错,对‘i’的引用有歧义,需要修改匿名空间中的i为j,避免有全局变量重名
return 0;
}
---------------------
作者:gocgocgo
来源:CSDN
原文:https://blog.csdn.net/Tostick/article/details/80684318
版权声明:本文为博主原创文章,转载请附上博文链接!