C++中include和using namespace的用法

C++引入命名空间解决函数重名问题,避免使用#include时的冲突。命名空间如std用于封装标准库,可通过usingnamespace导入。#include用于包含头文件,编译时内容会被插入。若需同时使用不同命名空间的同名函数,应避免全局usingnamespace,而是在调用时指定命名空间。

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

首先要明确的是:在C中,没有namespace。在标准C++以前,都是用#include<xxxx.h>这样的写法的,因为要包含进来的头文件名就是xxxx.h

标准C++引入了名字空间的概念,并把iostream等标准库中的东西封装到了std名字空间中,同时为了不与原来的头文件混淆,规定标准C++使用一套新的头文件,这套头文件的文件名后不加.h扩展名,如iostreamstring等等,并且把原来C标准库的头文件也重新命名,如原来的string.h就改成cstring(就是把.h去掉,前面加上字母c),所以头文件包含的写法也就变成了#include

举例说明

#include用于引用其他文件的内容(如#include “a.h”),编译器在编译时,在使用include的文件中(如名为main.cpp),将include这句话替换为其文件内容,相当于物理上的复制替换。

//a.h
void fun();

当不同的两个文件中,使用了相同的函数名(a.hb.h两个文件中都有fun()),函数内容却不同,根据上文来看,如果使用include同时引用两个文件,则在编译时,main.cpp文件中出现了两个fun(),因此重名,后面调用函数时也不知道调用的哪个函数。

那么,如何解决以上问题?c++的命名空间namespace因此诞生,把两个函数定义在不同的命名空间中,然后在需要调用函数的文件中加入using namespace(注意#include也需要写),将当前使用的函数链接到它声明的地方。

//a.h
namespace f1 {
	void fun();
}
//a.cpp
namespace f1 {
	void fun()
	{
		int c = 0;
	}
}
//main.cpp
 #include <a>
 using namespace f1;
 int main()
 {
	fun();
 }

//或者
 #include <a>
 int main()
 {
	f1::fun();
 }

在上面的main.cpp中,第一种方法,使用 using namespace,则当前整个文件中使用的fun()都会链接到命名空间为f1的函数fun()中。那么如果在main.cpp文件中既想使用f1中的fun(),又想用f2(b.h的命名空间)中的fun(),则使用 using namespace链接两个命名空间吗?这会造成下面函数调用时依旧指向不明,会报链接错误。这时就需要使用上面的第二种方法,不在文件顶部使用using namespace,而是在调用函数时写出命名空间进行链接。

总结

因此,#include是用于添加文件,而using namespace用于保持代码结构整洁干净,并将其打包在“有意义”的库中。当你编程时可以省略using namespace,但绝对需要使用#include。并不是写了#include就必须用using namespace std;我们通常这样的写的原因是为了一下子把std名字空间的东西全部暴露到全局域中(就像是直接包含了iostream.h这种没有名字空间的头文件一样),使标准C++库用起来与传统的iostream.h一样方便。如果不用using namespace std;使用标准库时就得时时带上名字空间的全名,如std::cout << “hello” << std::endl

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宇宙无穷,盈虚有数

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值