C++ 命名空间

在这一章中C++ 头文件说明_c++ 头文件 说明注释写法-CSDN博客

提到了可以用命名空间的方式规避函数变量命名冲突。

具体是怎么做呢?今天在这里说明一下。

用namesapce 来定义命名空间。

如:

cpp 复制代码
namespace myspace{

}

在大括号里,就可以写你的变量和函数代码了。

这样,这里面变量和函数都属于mysapce命名空间。

示例代码:

cpp 复制代码
#include <iostream>

using namespace std;
namespace myspace{  //定义命名空间myspace
    int a = 5;
    void couta()
    {
        cout << a << endl;
    }
}
namespace mysp2  //定义命名空间mysp2
{
    int a = 52;
    void couta()
    {
        cout << a << endl;
    }
}

int main() {
    //调用命名空间各自的couta函数
    myspace::couta();
    mysp2::couta();
}

效果:

可以看到,定义命名空间后,就可以放心的在里面写代码了,不用担心和其他文件命名冲突了。

只需要在调用的时候,命名空间名加上::使用。

如果我们不想加上命名空间名,则开头加上using namespace myspace 引用。

cpp 复制代码
#include <iostream>

using namespace std;
namespace myspace{  //定义命名空间myspace
    int a = 5;
    void couta()
    {
        cout << a << endl;
    }
}
namespace mysp2  //定义命名空间mysp2
{
    int a = 52;
    void couta()
    {
        cout << a << endl;
    }
}
using namespace myspace;//引入myspace命名空间

int main() {
    //直接调用
    couta();
}

这里需要注意的是如果后面又加了using namespace mysp2;

两个命名空间有同名变量或函数,这种用法就会有冲突是不合法的。

如果不想using引用整个命名空间,只想使用命名空间的某个函数或某个变量,可以这样引用:

cpp 复制代码
using  myspace::couta;

这样mysapce命名空间的变量a不会被访问到。

前面是单文件的示例了,接下说一下多文件怎么使用。

像正常编写多文件cpp一样,需要分成头文件.h和cpp(注意:另提一点如果是定义模板类则尽量代码也写在.h中)。

头文件中,写命名空间的声明,变量要加上extern ,函数名可以不用加,如

myspace.h

cpp 复制代码
//命名空间 声明 
namespace myspace {
	extern int a;
	void couta();
}

myspace.cpp

cpp 复制代码
#include<iostream>
#include"myspace.h"
using namespace std;
//命名空间定义
namespace myspace{
	int a = 10;
   
    void couta()
    {
        cout << a << endl;
    }
}

main主程序cpp

cpp 复制代码
#include <iostream>
#include"myspace.h"
using namespace std;
//命名空间 使用
using namespace myspace;
int main() {

    couta();
}

运行效果:

ok,以上就是命名空间大概的使用和创建的方法。

这里还要提的一个点的是:

cpp 复制代码
using namespace myspace;
int main() {

    myspace::couta();
}

using了命名空间,然后又再指定命名空间mysapce::couta.

为什么好像不会引起重复引用的问题,比如不会变成这样:

myspace::myspace::couta();

为了避免这样的误解,我们必须了解命名空间的解析方法。

当使用了using namespace myspace;后,编译器会在当前的作用域查找变量和函数是否属于mysapce。而不是给所有的函数和变量硬性加上mysapce。这是智能的。

而当遇到myspace::couta();,这种用法的优先级更高,所以也会忽略掉using namespace myspace;而是直接去mysapce里面查找。所以这两者共同使用完全没问题。

相关推荐
IvanCodes5 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae6 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
qq_2518364579 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理10 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手10 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
qq_1998868710 小时前
第8板块·第2节:统一内存的高级特性与性能调优
c++·人工智能·gpu算力·cuda
+VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
阿里嘎多学长11 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
2401_8390805411 小时前
C++常见八股
数据结构·c++·算法
qq_1998868711 小时前
第6板块 第2节 CUDA运行时API与驱动API 核心笔记
c++·人工智能·gpu算力