如何系统地理解C++中的namespace

如何系统地理解C++中的namespace, TensorRT中有哪些namespace

参考 & COpy

C++中的namespace(using namespace)的详细理解_c语言using namespace_福桐的博客-CSDN博客

背景:

1、变量和函数等的作用范围是有一定的限制;比如,在函数体中定义的一个临时变量就不可以在函数体外使用。

2、在 C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类作用域,类是出现在文件内的。在不同的作用域中可以定义相同名字的变量,互不于扰,系统能够区别它们。

要解决的问题:

1、为了解决变量和函数等的作用范围,在C++语言中引入了命名空间的概念,并增加了关键字namespace和using

基本概念:

1、在一个命名空间中可以定义一组变量函数,这些变量和函数的作用范围一致,可以将这些变量和函数称为这个namespace的成员

2、namespace c=car; // 定义命名空间的别名

3、int Time; // 外部变量属于全局命名空间 global namespace;

4、 // width=2; // 对于非全局变量当前有效临时变量应该指定命名空间

5、// 命名空间的嵌套

#include <conio.h>
#include <iostream.h>
namespace car // 命名空间的定义
{
  int model;
  int length;
  int width;
}

namespace plane
{
  int model;
  namespace size // 命名空间的嵌套
  {
    int length;
    int width;
  }
}

namespace car // 添加命名空间的成员
{
  char * name;
}

namespace c=car; // 定义命名空间的别名
int Time; // 外部变量属于全局命名空间

void main()
{
  car::length=3;
  // 下面一句错误,故屏蔽掉
  // width=2; // 对于非全局变量和当前有效临时变量应该指定命名空间
  plane::size::length=70;
  cout<<"the length of plane is "<<plane::size::length<<"m."<<endl;
  cout<<"the length of car is "<<car::length<<"m."<<endl;
  // 使用命名空间的别名
  cout<<"the length of c is "<<c::length<<"m."<<endl;
  int Time=1996; // 临时变量,应区别于全局变量
  ::Time=1997;
  cout<<"Temp Time is "<<Time<<endl;
  cout<<"Outer Time is "<<::Time<<endl;
  // 使用关键字using
  using namespace plane;
  model=202;
  size::length=93;
  cout<<model<<endl;
  cout<<size::length<<endl;
  getch();
}

运行结果:
the length of plane is 70m.
the length of car is 3m.
the length of c is 3m.
Temp Time is 1996
Outer Time is 1997

6、命名空间:实际上就是一个由程序设计者命名的内存区域

优势:

1、通过命名空间,可以在同一个文件中使用相同的变量名或函数名,只要它们属于不同的命名空间。

2、另外,命名空间可以使得代码操作具有相同名字但属于不同库的变量

这个是怎么做到的呢?把namespace补充上就好了呗;

3、而且,命名空间也可以提高C语言与C++语言的兼容性。

暂时还理解不了,等好好学学C的代码吧;

C语言程序中各种功能基本上都是由函数来实现的,在C语言的发展过程中建立了功能丰富的函数库,C++从C语言继承了这份宝贵的财富。在C++程序中可以使用C语言的函数库。

如果要用函数库中的函数,就必须在程序文件中包含有关的头文件,在不同的头文件中,包含了不同的函数的声明。

在C++中使用这些 头文件有两种方法。 1、用C语言的传统方法 头文件名包括后缀.h,如stdio.h,math.h等。由于C语言没有命命名空间,头文件并不存放在命命名空间中,因此在C++程序文件中如果用到带后缀.h的头文件时,不必用命命名空间。只需在文件中包含所用的头文件即可。如 #include

2、用C++的新方法 C++标准要求系统提供的头文件不包括后缀.h,例如iostream、string。为了表示与C 语言的头文件有联系又有区别,C++所用的头文件名是在C语言的相应的头文件名(但不包括后缀.h)之前加一字母c。例如,C语言中有关输入与输出的头文件名为stdio.h在C++中相应的头文件名为cstdio。C语言中的头文件math.h,在C++中相应的头文什名为cmath。C语言中的头文件 string.h在C++中相应的头文件名为cstring。注意在C++中,头文件cstnng和头文件strmg不是同一个文件。前者提供C语言中对字符串处理的有关函数(如strcmp,ctrcpy)的声明,后者提供C++中对字符串处理的新功能。 此外,由于这些函数都是在命命名空间std中声明的,因此在程序中要对命命名空间std作声明。如: #include #include using namespace std; 目前所用的大多数C++编译系统既保留了c的用法,又提供丁C++的新方法。下面两种用法等价,可以任选。 C传 统方法 C++新方法 #include #include #include #include #include #include using namespace std; 可以使用传统的c方法,但应当提倡使用C++的新方法。

小结:

1、从上面可以看出,命名空间定义了一组变量和函数,它们具有相同的作用范围。对于不同的命名空间,可以定义相同的变量名或函数名,在使用的时候,只要在变量名或函数名前区分 开不同的命名空间就可以了。

2、命名空间可以被嵌套定义,使用时要逐级对成员用命名空间限定符: :来引用。

3、系统默认有一个全局命名空间,它包含了所有的外部变量。这个命名空间没有名字,引用这个 命名空间里的变量时要使用命名空间限定符: :,前面没有名字。在不使用命名空间的情况下,我 们知道,不可以在不同文件中定义相同名字的外部变量,这是因为它们属于同一个全局名 空间,名字不可以重复

4、可以给命名空间取一个别名。一般别名是一个比较短的名字,来简化编程。

5、在原有定义好的命名空间的基础上,随时可以往里增加成员。

为什么要使用using

1、在前面的例程中可以看到,为了使用时的方便,又引入了关键字using。利用using声明可以在引用命名空间成员时不必使用命名空间限定符::。

2、此外,关键字namespace和using的使用,对函数重载有一定的影响。

下面通过例程进行具体说明。
#include <conio.h>
#include <iostream.h>
namespace car // 命名空间的定义
{
  void ShowLength(double len) // 参数类型为d o u b l e
  {
    cout<<"in car namespace: "<<len<<endl;
  }
}

namespace plane // 命名空间的定义
{
  void ShowLength(int len) // 参数类型为i n t
  { 
    cout<<"in plane namespace: "<<len<<endl;
  }
}

void main()
{
  using namespace car;
  ShowLength(3);
  ShowLength(3.8);
  using namespace plane;
  ShowLength(93);
  ShowLength(93.75);
  getch();
}

运行结果:
in car namespace: 3
in car namespace: 3.8
in plane namespace: 93
in car namespace: 93.75

如果没有命名空间的干扰,函数重载时选择规则将是非常简单。只要实参是double类型,则调用的是前面的函数;如果实参是int类型,则调用后面的函数。但是由于命名空间的参与,就出现了上面的运行结果。所以在编程的时候一定要注意命名空间对函数重载的影响。

需要注意的地方:

1、调用函数时,如果实参和形参的数据类型实在没有办法完全匹配,可能会对实参进行适当的数据类型转换。比如,将char类型转换为int类型,或进一步将int类型转换为double类型。这种是将数据类型从简单往复杂转换,一般不会丢失信息。

2、另外一种转换是反过来,将double类型转换为int类型,或进一步将int类型转换为char类型。这种是将数据类型从复杂往简单转换,可能会丢失部分信息。在调用函数的时候,不同的情况下,C++对上述两种转换的优先级是不同的。当引入了命名空间后,则参与了上述优先级顺序的分配。【说的有点抽象了,暂时还没有办法完全Get到】。

3、using namespace std之后,就省去了std::,可以直接引用std空间里面的函数和变量。

tensorRT中的namespace

https://docs.nvidia.com/deeplearning/tensorrt/api/c_api/namespaces.html

image-20230925155733944

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值