【C++】namespace命名空间

前言

1、namespace命名空间:指标识符的各种可见范围。

C++ 程序一开始引用using namespace std;的原因:C++ 标准程序库中所有的标识符都被定义在一个std的namespace。

2、namespace 出现契机:大型程序往往会使用多个独立开发的库,这些库又会定义大量的全局名字,如类、函数和模板等。当应用程序用到多个供应商提供的库时,不可避免地会发生某些名字相互冲突(重复)的情况。多个库将名字放置在全局命名空间中将引发命名空间污染(namespace pollution)。
3、命名空间包括有名命名空间和无名命名空间。
4、命名空间成员类型:变量(可初始化)、常量、函数、类、结构体、模板、命名空间(嵌套)

一、有名命名空间

1、定义格式

namespace 空间名	{
    
    
	code
}

//	有名命名空间的嵌套定义
namespace 空间名1	{
    
    
	code;
	namespace 空间名2 {
    
    
	}
}

2、使用格式

//	直接使用 "::" 连接空间名和 code
空间名::code;		//	code为变量或函数

3、取别名定义格式(代替较长的命名空间)

namespace 别名 = 空间名;

4、using 指令使用格式
(1)可以一次声明命名空间的所有成员,但是使用的前提是不能有同名冲突;
(2)命名空间中的成员在本文件可以当作全局变量来使用;
(3)无名命名空间只能在本文件使用。

//	表示后面代码都使用此命名空间,如果属于本空间,无需再使用 "::" 连接空间名和 code
using namespace 空间名;		// 空间名支持嵌套

//	最常用的 std 空间
using namespace std;

5、示例

#include <iostream>
// 使用std命名空间下的变量
using namespace std;
// 外部变量属于全局命名空间
int a = 23;

namespace nameSpace1 {
    
    
    int a = 10;

    // 命名空间支持嵌套定义
    namespace nameSpace2 {
    
    
        int a = 15;
        int b = 20;
    }

    // 命名空间可以重复定义,相当于扩充
    namespace nameSpace2 {
    
    
        int x = 30;
        int y = 35;
    }
}

namespace nameSpace3 {
    
    
    int a = 25;
    // 错误,命名空间不能嵌套声明
//    namespace D;
}

int main(void)
{
    
    
    // 如果不写using namespace std,就必须加前缀std::
    std::cout << "Gorgeous!" << std::endl;
    cout << endl;   

    cout << "a = " << a << endl;
    cout << "nameSpace1::a = " << nameSpace1::a << endl;
    cout << "nameSpace1::nameSpace2::a = " << nameSpace1::nameSpace2::a << endl;
    cout << "nameSpace3::a = " << nameSpace3::a << endl;

    // 错误,提示变量b没有声明
//    cout << "b = " << b << endl;

    cout << endl;

    // 命名空间取别名
    namespace AB = nameSpace1::nameSpace2;
    cout << "AB = nameSpace1::nameSpace2" << endl;
    cout << "AB::a = " << AB::a << endl;
    cout << "AB::b = " << AB::b << endl;

    cout << endl;

    // 后面的代码使用nameSpace1::nameSpace2命名空间下的变量
    using namespace nameSpace1::nameSpace2;
    cout << "使用nameSpace1::nameSpace2命名空间" << endl;
    cout << "b = " << b << endl;
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;

    return 0;
}

在这里插入图片描述

二、无名命名空间

命名空间不仅可以避免冲突,还可以使代码保持局部性,从而规避被非法使用。
在当前的编译单元直接使用无名命名空间中的成员,但为当前编译单元之外不可见。

1、定义格式

namespace {
    
    
	code
}

2、示例

#include <iostream>
// 使用std命名空间下的变量
using namespace std;

// 如果定义与无名命名空间相同,则会产生冲突报错
//int a = 5;

namespace {
    
    
    int a = 10;
    int b = 20;

    namespace B {
    
    
        int a = 30;
        int b = 40;
    }

    int add(int a, int b)
    {
    
    
        return (a + b);
    }
}

int main(void)
{
    
    
    // 默认使用无名命名空间中的变量和空间
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "B::a = " << B::a << endl;
    cout << "B::b = " << B::b << endl;

    cout << endl;

    cout << "a + b = " << add(a, b) << endl;
    cout << "B::a + B::b = " << add(B::a, B::b) << endl;

    return 0;
}

在这里插入图片描述

总结

1、命名空间可嵌套定义,但不能嵌套声明;
2、命名空间的定义只能在全局上,不能在局部范围内;
3、命名空间定义后无分号;
4、可对同一命名空间进行多次声明和定义,相当于成员扩充;
5、无名命名空间的成员不能与同一文件中外部文件的成员相同;
6、无名命名空间的成员类似于全局变量;

引用
namespace
[C++] namespace命名空间和using用法

猜你喜欢

转载自blog.csdn.net/weixin_46134582/article/details/129174936
今日推荐