C++嵌套和匿名的命名空间namspace

嵌套的命名空间


其作用是改进库中代码的组织架构,防止库中命名冲突

::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. 匿名的命名空间可以在给定文件中不连续,但不能跨越多个文件;定义的名字只在本文件中可见。
  2. 匿名的命名空间用于声明局部于文件的实体,在匿名的命名空间中定义的变量在程序开始时创建,在程序结束时一直存在。
  3. 匿名的命名空间中定义的名字可直接使用,没有完全限定名。
  4. 匿名的命名空间中定义的名字可以在定义该命名空间所在的作用域中可见,如果在文件的最外层作用域中定义匿名的命名空间,那么该匿名的命名空间中的名字必须与全局作用域中的名字不同。

示例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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值