在c语言中,当程序达到一定的规模之后,会遇到的一个问题是我们“用完”了函数名和标识符。当然,并非真的用完了,只是简单的想出一个有意义的新名称不太容易了。在C++中,有预防这种冲突的机制:namespace关键字。只要标识符定义在不同的空间中,就不会产生冲突。如果要使用某个命名空间中的声明或定义,就用关键字using,比如using namespace std;
定义一个命名空间:
namespace MyNamespace
{
//Declarations声明序列
}
使用命名空间:
不使用using指令,这个命名空间的所有名字都需要被完全限定:
#include<iostream>
int main()
{
std::cout <<"NOT USE using namespace" << std::endl;
return 0;
}
使用using
#include<iostream>
int main()
{
cout <<"use using namespace" <<std::endl;
return 0;
}
命名空间可以被嵌套,使用时要逐级对成员用名空间限定符: :来引用。
using指令和using声明:
using指令即:using namespace 命名空间名称;比如using namespace std;使用using指令可能会引入带命名冲突的名字空间。
using声明:using 命名空间名::[命名空间名::……]成员名;可以使用using namespace一次性引入到当前范围内。
如:
#ifndef USINGDECLARATION_H
#define USINGDECLARATION_H
namespace U{
inline void f(){}
inline void g() {}
}
namesapce V{
inline void f(){}
inline void g(){};
}
#endif
#include "UsingDeclarationn.h"
void h()
{
using namespace U; //using指令
using V::f();//using声明
f(); //V::f()
U::f();
}
using声明给出了标识符的完整的名字,但没有了类型声明方面的信息。也就是说,如果命名空间中包含了一组用相同名字重载的函数,using 声明就声明了这个重载的集合内的所有函数。
using声明与普通声明只有一点不同:using声明可以引起一个函数用相同的参数类型来重载(这在一般的重载中是不允许的)。
using声明也可以出现在一个命名空间内,其作用与在其他地方一样:
#include "UsingDeclaration.h"
namespace Q{
using U::f;
using V::g;
//......
}
void m()
{
using namespace Q;
f(); //u::f()
g();//v::g()
}
一个声明是一个别名,它允许在不同的名字空间声明同样的函数。如果不想由于引入不同名字空间而导致重复定义一个函数时,可以使用using声明,它不会引起任何二义性和重复。
不要把一个全局using指令引入到一个头文件中,因为那将意味着包含这个头文件的任何其他头文件也能打开这个命名空间。所以,在头文件中,最好使用明确的限定或者被限定在一定范围内的using指令和using声明。
原文链接: https://www.cnblogs.com/ckings/p/3635123.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/125528
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!