C++中的命名空间(namespace)

C++中的命名空间(namespace)
在c/c++编程中,同一个作用域内非重载的情况下不能定义同名的实体(变量、函数、结构体、类等),如果在同一作用域内定义了同名的实体,则使编译器无法分辨从而引起歧义,最终编译失败。如:在一个头文件header1.h中定义了一个全局变量 int a,而另一个头文件header2.h中也定义了一个全局变量int a(注:此时没有extern关键词),那么在主函数main中同时包含了这两个头文件,当程序中要使用变量a时时编译器就不知道要调用哪一个头文件中的变量a,编译出错
为了解决这一问题,c++提出了命名空间机制,所谓命名空间即使有程序员命名的内存区域,程序员可以根据需要指定有名的内存空间用来存放指定的实体。把一些全局实体分别存放在不太的命名空间中,从而与其他全局实体分隔开来,这样编译器就可以根据不同的命名空间区分相同名字的实体。如上面的例子,将两个头文件中的全局变量分别放到两个不同的命名空间中:
/* header1.h */ 
namespace NS1
{
int a;
}

/* header2.h */ 
namespace NS2
{
int a;
}

那么在主函数main中调用变量a时就可以用命名空间名和作用域操作符“::”来区分不同两个头文件中的变量a;如NS1::a=10;则表示给header1.h中的变量a赋值,NS2::a=10;则表示给header2.h中的变量a赋值。

命名空间的用法及性质:
1.声明命名空间
namespace NAMESPACE_NAME                               //NAMESPACE_NAME  指命名空间名,可以是任意合法的标识符
{
// 命名空间成员 ,可以包括:变量(可以带初始化)、常量、函数(可以是定义或声明)、结构体、类、模版、命名空间
}

2.调用命名空间
(1)直接使用命名空间名和作用域操作符“::”+实体名
         NS1::a=10;  
(2)使用命名空间的别名作用域操作符“::”+实体名
       namespace N1 = NS1;
       N1::a=10;
(3)使用using命名空间成员名
        using NS1::a;   //说明下面要用到NS1这个命名空间中的a成员,下面可以直接调用a即可,这时默认为NS1::a。
        a=10;   // 这时等价于NS1::a=10; 
(4)使用using namespace 命名空间
using namespace  NS1;   //说明下面要用到NS1这个命名空间中的某些成员,下面可以直接调用a即可,这时默认为NS1::a。
a=10;   // 这时等价于NS1::a=10; 

无名命名空间

以上说的命名空间都是默认指有名命名空间,C++支持无名命名空间,即声明命名空间时不带名,这样无法通过命名空间名字调用该空间中成员,所以无名命名空间可以使其他文件无法使用该空间中的成员,如:
namespace
{
void function();
}
这里用无名命名空间声明了一个函数function,由于该空间没有名字,其他文件无法通过命名空间名来使用他的成员,所以达到了将该函数的作用域限制在本文件内的目的。作用和用static关键字声明的静态函数相似,而在无名命名空间中可以同时声明多个“静态函数”。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值