using
是C++中的关键字
命名空间作用域参考 两种形式:
using 命名空间名 ::标识符名;将指定的标识符暴露在当前的作用域内,使得在当前作用域可以直接引用该标识符;
using namespace 命名空间名;将指定命名空间内的所有标识符暴露在当前的作用域内,使得在当前作用域中可以直接引用该命名空间内的任何标识符。
两种特殊的命名空间:
全局命名空间:默认的命名空间,在显式声明的命名空间之外声明的标识符都在一个全局命名空间中。
匿名命名空间:一个需要显式声明的没有名字的命名空间,匿名命名空间常被用来屏蔽不希望暴露给其他源文件的标识符。
namespace(命名空间)
也是C++的关键字,命名空间的意思
namespace即“命名空间”,也称“名称空间” 。是许多编程语言使用的一种代码组织的形式,通过命名空间来分类,区别不同的代码功能,避免不同的代码片段(通常由不同的人协同工作或调用已有的代码片段)同时使用时由于不同代码间变量名相同而造成冲突。
98年以后的c++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题。
所谓命名空间,是一种将程序库名称封装起来的方法,它就像在各个程序库中立起一道道围墙。可能这也认识还是有点抽象,看看下面的例子就好明白了。
命名空间使用方法:
1.域限定符“::”:
命名空间名称::空间中的成员
space_name::space_member;
如果是命名空间嵌套的情况,依次往里
namespace A
{
int a = 100;
namespace B //嵌套一个命名空间B
{
int a =20;
}
}
//像这样,访问到B中的a
cout <<"A::B::a ="<<A::B::a << endl;
2.使用using声明:
一个using 声明一次只能作用于一个命名空间,它明确指出了用到的命名空间,其格式如下:
using namespace name_space;(name_space所有成员可用)
using name_space::space_member;(只引用space_member这一个成员,而其他成员不可见)
3.别名:
名字空间的命名太长时,可以给它取个别名。比如:namespace thisisalongname=lname;
std
一个名称,标准库所在的命名空间的名称
若要在程序中使用string class,以及cin,cout这两个iostream类的对象,不仅需要包含头文件,还需要让命名空间std中的名称曝光,即using directive(n指示,指令)。
来看例子:
// test1.h
char sum(char);
class People{ ... };
// test2.h
class People{ ... };
以上两个头文件不能包含在同一个程序中,因为都有名称为People的类,我们都知道,机器执行程序的过程中是不允许有歧义的,这样会产生名称冲突,机器可不知道要去使用哪个头文件中的People类了。
#include <iostream>
using namespace std ;
//声明///
namespace huhu1
{
void hello();
}
namespace huhu2
{
void hello();
}
void thank();
/
int main()
{
{
using namespace huhu1;
//使用huhu1、std、全局三个命名空间
hello();
}
{
using namespace huhu2;
//使用huhu2、std、全局三个命名空间
hello();
}
big_greeting();
//使用了std和全局两个命名空间
return0 ;
}
///定义//
namespace huhu1
{
void hello()
{
cout<<"这个hello来自命名空间huhu1" ;
}
}
namespace huhu2
{
void hello()
{
cout<<"这个hello来自命名空间huhu2" ;
}
}
void thank()
{
cout<<"thank you" ;
}
命名空间具体的使用方法博客文章参考菜鸟教程C++命名空间参考 评论区一个很棒的例子,记录一下
- 正确用例
#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,用于当有同名的局部变量时来区别两者。
结果:
A::a =100
A::B::a =20
a =200 //全局变量a
::a =200
a =30 //局部变量a
::a =200
- 错误用例
#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()。