c++ 中的 namespace 用法

多人代码的整合,namespace 还是非常有用的。可以很轻松的避免变量与函数一样的命名


1. namespace 在 单个头文件 中使用

下面给一个简单示例演示命名空间和自定义头文件的使用,代码如下:

compare.h:

namespace compare{
    double max(const double* data,int size);
    double min(const double* data,int size);
}


compare.cpp:

#include "compare.h"
double compare ::max(const double* data,int size){
    double result=data[0];
    for(int i=1;i<size;i++)
        if(result<data[i])
            result=data[i];
        return result;
}
double compare ::min(const double* data,int size){
    double result=data[0];
    for(int i=1;i<size;i++)
        if(result>data[i])
            result=data[i];
        return result;
}

test.cpp:

#include <iostream>
' #include "compare.h"    '
using compare::max;
using compare::min;
//可以用下面指令的代替上面的声明
//  using namespace compare;
using std::cout;
using std::endl;

int main(){
    double data[]={1.2,3.3,5.4,2.6,4.7,6.8};
    const int dataSize=sizeof data/sizeof data[0];
    cout <<"Min double is "<<min(data ,dataSize)<<endl;
    cout<<"Max double is "<<max(data,dataSize)<<endl;
    return 0;   
} 


2. namespace 在源文件中使用

在这里继续演示一个完整的命名空间事例:
#include <iostream>
using namespace std ;
namespace savitch1 
{
    void greeting();
}
namespace savitch2 
{
    void greeting();
}
void big_greeting();
int main()
{
    {
        using namespace savitch2 ;
        //使用savictch2、std、全局三个命名空间
        greeting();
    }
    {
        using namespace savitch1 ;
        //使用savitch1、std、全局三个命名空间
        greeting();
    }
    big_greeting();
    //使用了std和全局两个命名空间
    
    return0 ;
}
namespace savitch1 
{
    void greeting()
    {
      &nbnbsp; cout<<"Hellofromnamespacesavitch1.\n" ;
    }
}
namespace savitch2 
{
    void greeting()
    {
        cout<<"Greetingsfromnamespacesavitch2.\n" ;
    }
}
void big_greeting()
{
    cout<<"ABigGlobalHello!\n" ;
}



3. 同一个 namespace 在 多个头文件 中使用

3.1 头文件相互独立

      a.h

#include <iostream>

namespace hh
{
    void aprintf(int m,int n);
}

      a.cpp

#include <iostream>
void hh::aprintf(int m,int n)
{
    print("this is by a: m=%d,n=%d \n",m,n);
}

      b.h

#include <iostream>

namespace hh
{
    void bprintf(int m,int n);
}

      b.cpp

#include <iostream>
void hh::bprintf(int m,int n)
{
    print("this is by b: m=%d,n=%d \n",m,n);
}

      main.cpp

#include <iostream>
 #include"a.h"
 int main()
 { 
     int m=10;
     int n=20;
     hh::aprintf(10,20); //这里仅仅有aprintf(),没有bprintf(),因为只包含了a.h头文件
     return 0;
 }

总结: namespace 中的方法,会根据头文件中定义的去查找!!!

同理1: 仅仅只包含 b.h 头文件, hh::只会出现bprintf()

同理2:若包主文件含两个 头文件(a.h,b.h),则aprintf() 与 bprintf() 都会出现



3.2 头文件之间嵌套

      a.h

#include <iostream>
namespace hh
{
    void aprintf(int m,int n);
}

      a.cpp

#include <iostream>
void hh::aprintf(int m,int n)
{
    print("this is by a: m=%d,n=%d \n",m,n);
}

      b.h

#include <iostream>
 #include"a.h"   ///( b.h 中引用了 a.h )

namespace hh
{
    void bprintf( );
}

      b.cpp

#include <iostream>
void hh::bprintf()
{
    int m = 200;
    int n = 300;
    hh::aprint(m,n);
}


3.2.1 主函数只用前半段(只包含最开始的.h文件)

      main.cpp

#include <iostream>
 #include"a.h"
 int main()
 { 
     int m=10;
     int n=20;
     hh::aprintf(10,20); //这里仅仅有aprintf(),没有bprintf(),因为只包含了a.h头文件
     return 0;
 }
 

总结: 若只包含最开始的.h文件,namespace找不到后边添加的成员!


3.2.2 主函数只用后半段(只包含最后的.h文件)

      main.cpp

#include <iostream>
 #include"b.h"
 int main()
 { 
     int m=10;
     int n=20;
     hh::aprintf(10,20); 
     hh::bprintf();       //两个都成员都会找到!!!!
     return 0;
 }
 

总结: 若只包含最后的.h文件,namespace可找到所有添加的成员!



3.3 总结

namespace可用的成员 都是根据头文件进行逐级向上查找的

总结图:

第一部分参考: http://blog.csdn.net/u010142437/article/details/32332253

  • 13
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值