none
请高手大哥解释一下C++中 namespace 的作用 RRS feed

答案

  • c++中,namespace 只是用来方便区分不同的代码段而已,没什么实际的效果。到了.net中,namespace被强化,成为所有模块甚至全局的命名符号。

     

    就c++而言,小型项目中很少有用namespace的,理由是不需要用。在大型项目中,就有必要用一下了。

     

    namespace主要功能是区分不同代码,以免混淆或者冲突。大项目中,对函数和类等命名的时候难免有冲突,比如cutstr、findxxx等基础函数,都是全局函数,放到一起编译的时候肯定会出错,这里就要用namespace了。

     

    比如有两个namespace :name1 和 name2 ,name1里定义了cutstr,name2里也定义了cutstr,这样就没有问题了,在name1范围内(用 using name1来指定,或者包含在name1范围内)的cutstr就是name1里定义的cutstr,name2里的就是用name2里定义的cutstr。如果要指明用哪个,可以用 name1::cutstr 的方式来指定具体的某一个。

     

    这样的话,每个独立的项目模块都放到一个namespace中,就不会跟其他模块产生任何冲突了;最后只要实现定义好的接口就行了。

     

    比如:

     

    namespace name1

    {

      int add(int a, int b)

      {

        return a+b;

      }

     

      int x1 = add(2, 3); // = 5 命名空间范围内,当然用自己的

    };

     

    namespace name2

    {

      int add(int a, int b)

      {

        return a*b;

      }

      int x2 = add(2, 3); // = 6 命名空间范围内,当然用自己的

      int x1 = name1::add(2, 3); // 明确指明了命名空间范围,用指定的。注意,这里的x1和name1里的x1是不同的

    }

     

    // 以下不属于任何命名空间,也就是全局范围内

     

    int x;

    x = add(2, 3); // 错误,add未定义

    x = name1::add(2, 3); // = 5

    x = name2::add(2, 3); // = 6

     

    using namespace name1;

    x = add(2, 3); // = 5, 因为引用了name1,所以用的是1

    using namespace name2;

    x = add(2, 3); // 这里会出问题,因为同时引用了name1和name2,都包含add,出现歧异
    2008年6月27日 9:16