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++命名空间参考 评论区一个很棒的例子,记录一下

  1. 正确用例
#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
  1. 错误用例
#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()。