首页 > 编程语言 >C++ 命名空间

C++ 命名空间

时间:2024-03-04 18:11:06浏览次数:19  
标签:std int namespace C++ 空间 命名 using

在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。

因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

定义命名空间

命名空间的定义使用关键字 namespace,后跟命名空间的名称

namespace namespace_name {
   // 代码声明
}

为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称

name::code;  // code 可以是变量或函数

来看看命名空间如何为变量或函数等实体定义范围:

#include <iostream>
using namespace std;
 
// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
int main ()
{
 
   // 调用第一个命名空间中的函数
   first_space::func();
   
   // 调用第二个命名空间中的函数
   second_space::func(); 
 
   return 0;
}

结果

Inside first_space
Inside second_space

using 指令

您可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。

#include <iostream>
using namespace std;
 
// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}
using namespace first_space;
int main ()
{
 
   // 调用第一个命名空间中的函数
   func();
   
   return 0;
}

结果

Inside first_space

using 指令也可以用来指定命名空间中的特定项目。例如,如果您只打算使用 std 命名空间中的 cout 部分,您可以使用如下的语句:

using std::cout;

随后的代码中,在使用 cout 时就可以不用加上命名空间名称作为前缀,但是 std 命名空间中的其他项目仍然需要加上命名空间名称作为前缀

#include <iostream>
using std::cout;
int main ()
{
   cout << "std::endl is used with std!" << std::endl;
   return 0;
}

结果

std::endl is used with std!

using 指令引入的名称遵循正常的范围规则。名称从使用 using 指令开始是可见的,直到该范围结束。此时,在范围以外定义的同名实体是隐藏的。

不连续的命名空间

命名空间可以定义在几个不同的部分中,因此命名空间是由几个单独定义的部分组成的。一个命名空间的各个组成部分可以分散在多个文件中。

所以,如果命名空间中的某个组成部分需要请求定义在另一个文件中的名称,则仍然需要声明该名称。下面的命名空间定义可以是定义一个新的命名空间,也可以是为已有的命名空间增加新的元素:

namespace namespace_name {
   // 代码声明
}

嵌套的命名空间

命名空间可以嵌套,您可以在一个命名空间中定义另一个命名空间

namespace namespace_name1 {
   // 代码声明
   namespace namespace_name2 {
      // 代码声明
   }
}

可以通过使用 :: 运算符来访问嵌套的命名空间中的成员:

// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;
 
// 访问 namespace_name1 中的成员
using namespace namespace_name1;

上面的语句中,如果使用的是 namespace_name1,那么在该范围内 namespace_name2 中的元素也是可用的

#include <iostream>
using namespace std;
 
// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
   // 第二个命名空间
   namespace second_space{
      void func(){
         cout << "Inside second_space" << endl;
      }
   }
}
using namespace first_space::second_space;
int main ()
{
 
   // 调用第二个命名空间中的函数
   func();
   
   return 0;
}

结果

Inside second_space

 

关于命名空间内变量和函数及全局变量的使用和作用域:

#include <iostream>
using namespace std;
namespace A
{
    int a = 100;
    namespace B            //嵌套一个命名空间B
    {
        int a =20;
    }
}

int a = 200;//定义一个全局变量
int main(int argc, char *argv[])
{
    cout <<"A::a ="<< A::a << endl;  
    cout <<"A::B::a ="<<A::B::a << endl;
    cout <<"a ="<<a << endl;
    cout <<"::a ="<<::a << endl;

    int a = 30;
    cout <<"a ="<<a << endl;
    cout <<"::a ="<<::a << endl;

    return 0;
}

结果:

A::a =100  
A::B::a =20
a =200      //全局变量a
::a =200
a =30       //局部变量a
::a =200    

全局变量 a 表达为 ::a,用于当有同名的局部变量时来区别两者。

 

关于 using 的错误事例

#include <iostream>
using namespace std;
namespace A
{
    int a = 100;
    int fun()
    {
        cout<<"a = "<<a<<endl;
    }
    namespace B            //嵌套一个命名空间B
    {
        int a =20;
        int fun()
        {
             cout<<"a = "<<a<<endl;
        }
    }
}
int main(int argc, char *argv[])
{
    cout<<a<<endl;
    fun();
    return 0;
}

这样会出错:会显示 a 变量和 fun 函数 “was not declared in this scope”,即找不到这个 a 和 fun 函数。

解决办法: 用 using 来告诉编译器用到的是哪个命名空间内的内容。在 main() 上面加 using namespace A; 或者 using namespace A::B; 。这样就可以使用其中的 a 和 fun()。但是不能同时使用,因为这样也会导致编译出错,编译器器不知道要去使用哪个 a 和 fun()。

 

补充一个命名空间冲突的情况:

#include <iostream>
using namespace std;
namespace A {
    int a = 100;
    namespace B            //嵌套一个命名空间B
    {
        int a = 20;
    }
}
int a = 200;//定义一个全局变量 int main(int argc, char *argv[]) { cout << "A::a =" << A::a << endl; //A::a =100 cout << "A::B::a =" << A::B::a << endl; //A::B::a =20 cout << "a =" << a << endl; //a =200 cout << "::a =" << ::a << endl; //::a =200 using namespace A; cout << "a =" << a << endl; // Reference to 'a' is ambiguous // 命名空间冲突,编译期错误。应该是分不清应该用全局变量的a还是命名空间A的a cout << "::a =" << ::a << endl; //::a =200 int a = 30; cout << "a =" << a << endl; //a =30 cout << "::a =" << ::a << endl; //::a =200 //即:全局变量 a 表达为 ::a,用于当有同名的局部变量时来区别两者。 using namespace A; cout << "a =" << a << endl; // a =30 // 当有本地同名变量后,优先使用本地,冲突解除 cout << "::a =" << ::a << endl; //::a =200 return 0; }

 

标签:std,int,namespace,C++,空间,命名,using
From: https://www.cnblogs.com/uacs2024/p/18052345

相关文章

  • C++系列:const关键字
    前言在学习C++时,const关键字的知识点分散在书的各个章节。当我们尝试在编程时使用const时,总会感觉有一些细节被遗忘,因而不能得心应手地使用const关键字。因此,本篇文章尝试着对const关键字的做一些总结。参考书籍《C++PrimerPlus》const总结这里是我做的关于const关键字的一些......
  • (持续更新)c++结构体
    结构体指针作用:通过指针访问结构体中的成员利用操作符->可以通过结构体指针访问结构体属性 1.指针访问单一结构体#include<iostream>#include<string>#include<ctime>usingnamespacestd;structStudent{stringname;intage;intscore;};i......
  • C++ 动态内存
    C++ 动态内存C++程序中的内存分为两个部分:栈:在函数内部声明的所有变量都将占用栈内存。堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。在C++中,您可......
  • C++ 异常处理
    菜鸟教程C语言中文网程序的错误大致可以分为三种,分别是语法错误、逻辑错误和运行时错误:1)语法错误在编译和链接阶段就能发现,只有100%符合语法规则的代码才能生成可执行程序。语法错误是最容易发现、最容易定位、最容易排除的错误,程序员最不需要担心的就是这种错误。2)逻辑错......
  • 关于SAP-APP机器-R3trans -d报错-R3trans: /lib64/libstdc++.so.6: version `GLIBCXX_
    在SAP-应用-APP-机器上执行如下命令报错awpxxx03:prdadm270>R3trans-dR3trans:/lib64/libstdc++.so.6:version`GLIBCXX_3.4.26'notfound(requiredbyR3trans) 其实之前,使用过一种方法解决这个问题,可以参考笔者另一篇文章《关于Redhat-Linux中-compat-sap-c++的说......
  • 拉普拉斯变换的积分上下限,或者说积分路径,是复数域的,但是w是单变量,一个单变量,怎么能在
       这个的积分上下限,或者说积分路径,是复数域的,但是w是单变量,一个单变量,怎么能在复空间上面积分呢? 做变换后,由一个维度变成两个维度。 ......
  • Python实现snap:对齐多张遥感影像的空间范围
      本文介绍基于Python中ArcPy模块,实现基于栅格图像批量裁剪栅格图像,同时对齐各个栅格图像的空间范围,统一其各自行数与列数的方法。  首先明确一下我们的需求。现有某一地区的多张栅格遥感影像,其虽然都大致对应着同样的地物范围,但不同栅格影像之间的空间范围、行数与列数、像......
  • Oracle 表空间和数据文件遇到的坑 (转载于 微信公众号 JieKeXu DBA之路)
    转载链接https://mp.weixin.qq.com/s/IKF_KrWkxZ5BJS-OacYWUw前言本文适用于普通的标准的8k块大小的Oracle企业版数据库,10g、11g、19c均可适用,但对于ODA,一体机可能有所区别,请慎重使用1.db_files的坑记录一下年前遇到的一个关于表空间扩容的小问题,大家都知道对于Oracle......
  • 【C++ STL容器set 】std::set 的全方位解析
    装载自知乎(虽然有AI辅助操作,但是确实写得好好):【C++STL容器set】std::set的全方位解析-知乎(zhihu.com)<imgsrc="https://pic3.zhimg.com/v2-cc8068b8931c7f65e9a89717e2ab404e_b.jpg"data-size="normal"data-rawwidth="1024"data-rawheight="1024......
  • C++编译过程
     第一步:.cpp→.i第二步:.i→.s  是汇编文件第三步:.s→.o 此时已经算是目标文件的最终形态了,完整后缀是.obj第四步:通过链接器将用的到的库,如.dll和.o文件连接起来,执行.exe就是相当于执行前面连接起来的这堆文件 详细过程和G++调用参考:https://zhuanlan.zhihu.c......