C++中的名字空间

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lemonrabbit1987/article/details/48489753

C++中引入了名字空间(namespace)的概念。名字空间有两方面的用途,一是将逻辑上相关的元素组织在一起,更重要的一点是解决函数和变量重名问题。

命名空间的定义方式如下:

namespace 名字空间名称
{
    //声明和定义
}

当在一个名字空间内访问另一个名字空间的函数、变量等时,需要额外添加限定词形如“名字空间名称::变量或函数名”。访问同一个名字空间的函数不需要限定符。

/****************************************
 * using_namespace_1.cpp                *
 *                                      *
 * C++名字空间的使用                    *
 ****************************************/

#include <iostream>

namespace namespace1
{
  int x = 5;
}

namespace namespace2
{
  int y = 10;

  void PrintY()
  {
    std::cout<<"y="<<y<<std::endl;
  }

  void PrintX()
  {
    std::cout<<"x="<<namespace1::x<<std::endl;
  }
}

int main()
{
  namespace2::PrintX();
  namespace2::PrintY();
  return 0;
}

使用命名空间
当在一个代码块中需要多次使用同一个限定符或使用多个限定符时,可以在变量或函数等元素使用之前,使用名字空间声明语句将名字空间中的所有元素或名字空间中特定的元素引入到本命名空间。相应地,名字空间声明语句包含两类,一类是引入某个命名空间中特定的元素,

using 名字空间名称::特定元素名称;

一类是引入某个命名空间中所有的元素,

using namespace 名字空间名称;
/****************************************
 * using_namespace_2.cpp                *
 *                                      *
 * C++名字空间的使用                    *
 ****************************************/

#include <iostream>

namespace namespace1
{
  int x = 5;
  int y = 15;
}

namespace namespace2
{
  int z = 10;
  int m = 20;
}

namespace namespace3
{
  using namespace1::x;
  using namespace1::y;

  void PrintX()
  {
    std::cout<<"x="<<x<<std::endl;
  }

  void PrintY()
  {
    std::cout<<"y="<<y<<std::endl;
  }
}

namespace namespace4
{
  using namespace namespace2;
  void PrintZ()
  {
    std::cout<<"Z="<<z<<std::endl;
  }

  void PrintM()
  {
    std::cout<<"m="<<m<<std::endl;
  }
}

int main()
{
  using namespace3::PrintX;

  PrintX();

  using namespace namespace4;
  PrintZ();
  PrintM();

  return 0;
}

使用命名空间
可以定义没有名称的名字空间,称为无名名字空间

namespace
{
  //声明
}

无名名字空间中声明的元素可以在本编译单位(预处理后形成的定义文件)中可用。不同编译单位的名字空间互不相同。

/****************************************
 * using_namespace_3.cpp                *
 *                                      *
 * C++名字空间的使用                    *
 ****************************************/

#include <iostream>

namespace
{
  int x = 5;
}

namespace
{
  int y = 10;

  void PrintY()
  {
    std::cout<<"y="<<y<<std::endl;
  }

  void PrintX()
  {
    std::cout<<"x="<<x<<std::endl;
  }
}

int main()
{
  PrintX();
  PrintY();
  return 0;
}

无名名字空间
当使用某个名字空间中声明的类型的元素作为函数的参数时,如果在该编译单元中找不到该函数的定义,则自动去该类型声明所在的命名空间中去查找相应函数。如果该函数是类的成
员函数,则优先从该类及其基类的成员函数中选择。

/****************************************
 * using_namespace_4.cpp                *
 *                                      *
 * C++名字空间的使用                    *
 ****************************************/

#include <iostream>

namespace namespace1
{
  struct Test
  {
    int x;
    int y;
  };
  void Print(Test test)
  {
    std::cout<<"x = "<<test.x<<std::endl;
    std::cout<<"y = "<<test.y<<std::endl;
  }
}

namespace namespace2
{
  void PrintX(namespace1::Test test)
  {
    /*没有显式引入Print,但由于参数类型是*
     *namespace1的,所以可以查到该函数   */
    Print(test);
  }
}

int main()
{
  namespace1::Test a = {10,20};
  namespace2::PrintX(a);
  return 0;
}

名字空间查找
可以为名字空间指定别名,使用以下命令:

namespace 新名字空间名称 = 旧名字空间名称;

名字空间别名可以用作原名字空间中的限定符,但不能通过该别名来扩展名字空间(添加新的声明或定义等)。

/****************************************
 * using_namespace_5.cpp                *
 *                                      *
 * C++名字空间的使用                    *
 ****************************************/

#include <iostream>

namespace namespace1
{
  int x = 5;
}

namespace namespace2
{
  int y = 10;

  void PrintY()
  {
    std::cout<<"y="<<y<<std::endl;
  }

  void PrintX()
  {
    std::cout<<"x="<<namespace1::x<<std::endl;
  }
}

int main()
{
  namespace NNN = namespace2;
  NNN::PrintX();
  NNN::PrintY();
  return 0;
}

名字空间别名

参考文献

1.Bjarne Stroustrup著,裘宗燕译. C++程序设计语言(特别版).机械工业出版社 2009.

展开阅读全文

名字空间问题(namespace)

04-26

源程序:rn <%@ Import Namespace="System.Data" %>rn <%@ Import Namespace="System.Data.ADO" %>rn <%@ Import Namespace="System.Data.SQL" %>rn rn rnrnrn Page_load事件演示rn rn/body>rnrnrnrn运行时错误:rn“/s”应用程序中的服务器错误。rn--------------------------------------------------------------------------------rnrn编译错误 rn说明: 在编译向该请求提供服务所需资源的过程中出现错误。请检查下列特定错误详细信息并适当地修改源代码。 rnrn编译器错误信息: BC30002: 未定义类型“SQLConnection”。rnrn源错误:rnrn rnrn行 6: Sub Page_Load(Src As Object, E As EventArgs) rn行 7: Dim DS As DataSetrn行 8: Dim MyConnection As SQLConnectionrn行 9: Dim MyCommand As SQLDataSetCommandrn行 10: '同数据库进行连接,采用sql server数据库 rn rnrn源文件: D:\My Documents\My Webs\pagedata.aspx 行: 8 rnrn显示详细的编译器输出:rnrnrnD:\WINDOWS\system32> "d:\windows\microsoft.net\framework\v1.0.3705\vbc.exe" /t:library /utf8output /R:"d:\windows\assembly\gac\system.xml\1.0.3300.0__b77a5c561934e089\system.xml.dll" /R:"d:\windows\assembly\gac\system.enterpriseservices\1.0.3300.0__b03f5f7f11d50a3a\system.enterpriseservices.dll" /R:"d:\windows\assembly\gac\system.drawing\1.0.3300.0__b03f5f7f11d50a3a\system.drawing.dll" /R:"d:\windows\assembly\gac\system.web.services\1.0.3300.0__b03f5f7f11d50a3a\system.web.services.dll" /R:"d:\windows\assembly\gac\system.data\1.0.3300.0__b77a5c561934e089\system.data.dll" /R:"d:\windows\assembly\gac\system\1.0.3300.0__b77a5c561934e089\system.dll" /R:"d:\windows\assembly\gac\system.web\1.0.3300.0__b03f5f7f11d50a3a\system.web.dll" /out:"D:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\Temporary ASP.NET Files\s\f5227082\a1159c90\lqzwiwyd.dll" /debug- "D:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\Temporary ASP.NET Files\s\f5227082\a1159c90\lqzwiwyd.0.vb"rnrnrnMicrosoft (R) Visual Basic .NET 编译器版本 7.00.9466rn用于 Microsoft (R) .NET 框架版本 1.00.3705rn版权所有 (C) Microsoft Corporation 1987-2001。保留所有权利。rnrnD:\My Documents\My Webs\pagedata.aspx(8) : error BC30002: 未定义类型“SQLConnection”。rnrn Dim MyConnection As SQLConnectionrn ~~~~~~~~~~~~~rnD:\My Documents\My Webs\pagedata.aspx(9) : error BC30002: 未定义类型“SQLDataSetCommand”。rnrn Dim MyCommand As SQLDataSetCommandrn ~~~~~~~~~~~~~~~~~rnD:\My Documents\My Webs\pagedata.aspx(11) : error BC30002: 未定义类型“SQLConnection”。rnrn MyConnection = New SQLConnection("server='iceberg';uid=sa;pwd=;database=info")rn ~~~~~~~~~~~~~ rnD:\My Documents\My Webs\pagedata.aspx(13) : error BC30002: 未定义类型“SQLDataSetCommand”。rnrn MyCommand = New SQLDataSetCommand("select * from infor",MyConnection) rn ~~~~~~~~~~~~~~~~~ rnD:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\Temporary ASP.NET Files\s\f5227082\a1159c90\lqzwiwyd.0.vb(20) : error BC30466: 无法找到 Imports“System.Data.ADO”的命名空间或类型“ADO”。rnrnImports System.Data.ADOrn ~~~~~~~~~~~~~~~rnD:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\Temporary ASP.NET Files\s\f5227082\a1159c90\lqzwiwyd.0.vb(21) : error BC30466: 无法找到 Imports“System.Data.SQL”的命名空间或类型“SQL”。rnrnImports System.Data.SQLrn ~~~~~~~~~~~~~~~rnrnrn请各位高手不吝赐教!rnrn 论坛

没有更多推荐了,返回首页