如何系统地理解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