C++基础---1.头文件&using&命名空间namespace使用详解---入门

本文深入解析C/C++中头文件的作用、使用方法及与命名空间的关系,探讨头文件在代码复用与组织中的优势,以及命名空间在解决命名冲突方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.头文件

1.头文件是什么?

在这里插入图片描述

简单描述头文件作用:

  • 把需要用到的变量、函数等信息,罗列在头文件里面(可以理解为新华字典里面的每个汉字), 运行文件直接引用头文件,然后就可以使用这个变量或者函数了。
  • 但是,具体这个函数是干了哪些事情(这个汉字的详细解释),这个可以在其他文件里面定义。
  • 这样做的好处是:可以统筹管理所有变量和函数、找起来会比较快(例如第一行是函数名,第200行才结束,你看到201行才能找到第二个函数,岂不是非常麻烦)

看看专业的解释:

  • 头文件的主要作用在于多个代码文件全局变量(函数)的重用、防止定义的冲突,对各个被调用函数给出一个描述,其本身不需要包含程序的逻辑实现代码,它只起描述性作用,用户程序只需要按照头文件中的接口声明来调用相关函数或变量,链接器会从库中寻找相应的实际定义代码。
    百度百科: 头文件
2.C/C++头文件啥区别?

c的头文件都是以.h结尾,如stdio.h、math.h

c++的头文件:

  • c++保留了c中的头文件风格,即大部分c的头文件都可以在c++中使用,也可以自定义c类型头文件在c++中使用
  • c的标准头文件在c++中去掉了.h后缀,添加了c前缀,如math.h改为cmath
  • c++自身的头文件,不带后缀,如iostream,其最大的不同就是c++类型头文件可以包含命名空间,而.h后缀的则不行

看到其他大神些的博客,头文件最好不要使用命名空间namespace:
https://blog.csdn.net/qq_41230365/article/details/80191964

3.如何使用头文件呢?
//header_02.h文件, 仅仅定义了一个函数

void alien();


// func.cpp源文件, 对函数alien有个详细的实现

#include "header_01.h"
#include <iostream>
using namespace std;


void alien() {
	cout << "alien函数的实现" << endl;
	int age = 28;
	cout << age << endl;
}

// run.cpp源文件,这个是引用了头文件,就可实现对函数的调用

#include <iostream>
#include <ctime>
#include "header_01.h"

int main()
{
	alien();
	cout << "hello主函数的实现" << endl;
}

//最终实现的结果为:

alien函数的实现
28
hello主函数的实现

2.using关键字

1.声明变量的作用

在使用using之前,如果全局变量和局域变量同时存在的时候,函数会自动使用全局变量。如果我们想使用的是局域变量,那就没办法了。


#include <iostream>
using namespace std;
int age = 28;

namespace alien {
    int age = 18;
}

void fun_01(){
    cout << age << endl;    
}

int main(){
    fun_01();
    getchar();
}

28
//因为程序头部,设置了全局变量28, 命名空间alien里面,虽然也有一个age,但是算局域变量。
//最终, fun_01函数没有在函数体里面发现局域变量,就只能找到全局变量age了

如上情况,我们需要指明,要使用的是局域变量,using的作用就是这个,请看

#include <iostream>
using namespace std;
int age = 28;

namespace alien {
    int age = 18;
}

void fun_01(){
    using alien::age;			# 只是比上面添加了这一行代码,就可以指明使用的是局域变量
    cout << age << endl;
    
}

int main(){
    fun_01();
    getchar();
}

18
// alien 命名空间下的age

局域变量和命名空间,不能在一个函数体里面,这样会导致函数有个【二义性】,函数不知道应该选择哪个变量,最终报错

#include <iostream>
using namespace std;

namespace alien {
    int age = 18;
}

void fun_01(){
    int age = 28;				//先指明一个变量
    using alien::age;			//再引用一个局域变量
    cout << age << endl;
    
}

int main(){
    fun_01();
    getchar();
}

函数会报如下的错误
在这里插入图片描述

2.编译指令的作用

可以理解为编译指令----打开某个命名空间,方便下面代码去使用次命名空间里面的变量


#include <iostream>
using namespace std;

namespace alien {
    int age = 18;
}

void fun_01(){
    int age = 18;
    using namespace alien;			//此处相当于打开了命名空间
    cout << age << endl;			//但,此处没用到上面的命名空间,而是用了局部变量
}

int main(){
    fun_01();
    getchar();
}

但如上的案例,不是我们推荐的使用方式,正确的如何:


#include <iostream>
using namespace std;

namespace alien {
    int age = 18;
}

namespace ware {
    int age = 28;
}

void fun_01(){
    using namespace alien;		# 通过using打开多个命名空间
    using namespace ware;

    cout << ware::age << endl;	#在不同的地方,使用不同命名空间的变量
}

int main(){
    fun_01();
    getchar();
}


3. namespace命名空间的使用

0.命名空间的定义:

https://blog.csdn.net/qq_40416052/article/details/82528676

  • 命名空间下,可以存放函数、变量、结果体、类等等
  • 命名空间,必须定义在全局作用域下面
  • 命名空间,可以嵌套定义命名空间
  • 命名空间是开放的,可以往命名空间里面添加内容
  • 命名空间可以是无名的、匿名的
  • 命名空间,可以使用别名
1.命名空间的应用

当我们定义某个函数的时候,不同的场景需要实现的功能不一样。那么我们就可以把函数放在不同的命名空间里面,这样同一个函数名,我使用不同空间下面的函数,得到的结果就可以不一样了。

在这里插入图片描述
在这里插入图片描述

// header_01.h, 定义了命名空间Alien,以及函数studying

namespace Alien {

	void studying();

}

// header_02.h, 定义了命名空间Alien02,以及函数studying

namespace Alien02 {

	void studying();

}
//func_01.cpp, 实现了Alien空间下的studying的功能

#include "header_01.h"
#include <iostream>
using namespace std;


void Alien::studying() {
	cout << "C语言的学习" << endl;
	int age = 18;
	cout << age << endl;
}

//func_02.cpp, 实现了Alien02空间下的studying的功能

#include "header_02.h"
#include <iostream>
using namespace std;


void Alien02::studying() {
	cout << "C++语言的学习" << endl;
	int age = 28;
	cout << age << endl;
}

// run.cpp文件,实现了最终调用的过程
#include <iostream>
#include "header_01.h"
#include "header_02.h"
using namespace std;


int main()
{
	cout << "run文件main函数-----start" << endl;
	Alien::studying();
	Alien02::studying();
	cout << "run文件main函数-----end" << endl;
	return 0;
}



//最终结果

run文件main函数-----start
C语言的学习
18
C++语言的学习
28
run文件main函数-----end

2.注意事项:
  • 最终调用的时候,如果引用2个头文件,且这2个头文件都有某个函数名的话,需要指明具体是哪个命名空间下的函数
#include <iostream>
#include "header_01.h"
#include "header_02.h"
using namespace std;


int main()
{
	cout << "run文件main函数-----start" << endl;
	studying();								//错误用法,因为没有指明具体是哪个命名空间下的studying函数
	cout << "run文件main函数-----end" << endl;
	return 0;
}

  • 只要使用cout函数,理论上当前文件就需要使用标准命名空间(std)以及引用输入输出头文件(iostream),但是如果在引用的头文件header_01.h或header_02.h里面,如果已经使用标准命名空间(std)和输入输出头文件,那么当前文件(run.cpp)文件就不需要再使用了。-----也就是说,c++支持命名空间和头文件的递归引用

  • 在func_01.cpp & func_02.cpp 中,需要指明命名空间下的函数,-----命名空间::函数名


void Alien02::studying() {
}

  • 如果不使用标准命名空间(std), 就不能直接使用cout函数,需要std::cout才行,但这样看起来比较臃肿
3.命名空间嵌套定义命名空间

#include <iostream>
using namespace std;

namespace Alien01 {

	int age = 18;

	namespace Alien02 {

		int age = 28;

	}

}



void main() {

	cout << Alien01::age << endl;
	cout << Alien01::Alien02::age << endl;		//多级命名空间嵌套调用

}

// 最终结果如下:

18
28

4.命名空间是开放的,可以往命名空间里面添加内容

#include <iostream>
using namespace std;

namespace Alien {

	int age = 18;
}

namespace Alien {

	int height = 188;

}


void main() {

	cout << Alien::age << endl;
	cout << Alien::height << endl;


}

// 最终结果:

18
188

5.命名空间,可以是无名的、匿名的

如果是无名的、匿名的,那么里面的变量相当于静态变量,只能在当前文件里面使用,不能被其他文件调用,所以这个很少用,也不推去使用


#include <iostream>
using namespace std;

namespace  {

	int age = 18;
}



void main() {

	cout << age << endl;

}
6.命名空间可以起别名

#include <iostream>
using namespace std;

namespace veryLongName {

	int age = 18;
}



void main() {

	namespace v = veryLongName;

	cout << v::age << endl;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello-alien

您的鼓励,是我最大的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值