C++的命名空间 namespace

来源:互联网 发布:php mysql 长连接 编辑:程序博客网 时间:2024/05/17 03:47

C++的命名空间:c++中不仅各种库函数和类使用名称空间来界定,用户还可以自定义命名空间。命名空间是一种描述逻辑分组的机制,可以将在逻辑上属于同一集团的标识符放在同一个名称空间中。


1.讲代码 -> 认识命名空间:

#include<iostream>using namespace::std;namespace One {int M = 200;int inf = 10;}namespace Two{int x;int inf = 100;}int main(int argc, char *argv[]){using Two::x;cout << x << endl;x = -100;One::inf *= 1;cout << One::inf << endl;cout << One::M << endl;Two::inf *= 2;cout << Two::inf << endl;cout << x << endl;return 0;}

执行结果:



分析:

1> 由于加上了命名空间,变量访问 = 命名空间 + 标识符,如Two::inf;


2.外号 -> 命名空间别名:

namespace Geometry_Representation_and_Operation{int gNum;}namespace GRO = Geometry_Representation_and_Operation;GRO::gNum = 123;

不要将命名空间的别名定义在头文件中,否则所有包含该头文件的源文件都拥有该别名的定义,失去了别名的意义。


3.神秘 ->定义 匿名命名空间:

匿名命名空间没有名字。

namespace{      int gNum;}

在一个程序中,每一个源代码文件都可以定义自己的匿名命名空间。在众多的匿名命名空间中,只要保证每个标识符在各自的命名空间中唯一即可,而不需要保证在所有匿名命名空间中都唯一。这是因为一个匿名命名空间只对其所在文件有效,而对其他文件无效。而且匿名命名空间没有名字,所以在其他源代码中也无法引用。

    Example:

////////////////////1.A.cpp文件////////////////////namespace{int gNum;}void fun(){gNum = 1314;}////////////////////2.B.cpp文件////////////////////namespace{int gNum;}int main(int argc,char *argv[]){gNum = 456;           //使用B.cpp文件中的gNumreturn 0;}

3.浅谈区别 -> 匿名命名空间和static的区别:

用static关键字修饰的全局变量和函数的链接属性是内部链接,而在匿名命名空间中的全局变量和函数是外部链接。

提示:

       一般,具有具有外部链接属性的全局变量和函数可以在其他文件中使用,而内部链接的全局变量和函数只能在本文件中使用。但是,由于不能跨文件访问匿名命名空间,所以虽然匿名命名空间中的全局变量和函数是外部链接,仍然不能跨文件访问。

代码实例:

#include<iostream>#include<cstdlib>using namespace std;template<char *p>struct foo                        //模板类foo{void bar(){};};static char a = 'a';            //静态全局变量namespace{char b = 'b';static char c = 'c';template<int NUM> static ABC   //匿名命名空间中的模板{};void foobar(){const int x = 123;              //局部变量,不具有外部链接属性//ABC<x>();                     //导致编译错误}}int main(int argc,int *argv[]){//foo< &a >().bar();    //a是静态变量,术语内部链接,所以会导致编译错误  foo< &b >().bar();    //b是匿名命名空间中的全局变量,属于外部链接,可编译//foo< &c >().bar();    //c是匿名命名空间中的静态变量,属于内部链接,编译错误foobar();               //调用匿名命名空间中的全局变量return 0;    //返回}

4.完美 -> 标准命名空间std

Example:

std::cout<< "Hello Word"<<std::endl;std::cin>>x;