关于namespace的文件组织

在C++新规定里面,引入了#include<iostream>的方式,而虽然对#include<iostream.h>兼容,但是前者解决了在大文件时候的命名冲突问题,下面就讨论一下namespace是如何使用,C++中的容器等使用时候为什么必须加std::,如std::vector<int> vi。

我查看了一下C++中的头文件(这里是不包含.h的模板头文件,关于头文件的组织形式,可以参考:C语言中关于.h和.c的问题.h文件和.cpp文件组织结构),在C++的标准头文件中,都有_STD_BEGIN作为开头,然后用_STD_END作为结尾,中间包含了文件的声明和定义。而_STD_BEGIN和_STD_END是宏定义,如下:  

  1. #define _STD_BEGIN  namespace std {  
  2. #define _STD_END        }  
  #define _STD_BEGIN	namespace std {
  #define _STD_END		}
可见,C++中的头文件都是定义在std的空间里的,因此,你即使包含了#include<iostream>如果不用std,仍然是不能使用iostream类的,因为这个类是在std这个命名空间里面,只能用std::iostream才可以。当然命名空间的三种使用方法都是可以的,如下:

一是:using namespace std;

二是:using iostream;

三是:std::iostream

到此就解释了为什么#include<iostream>using namespace std;会一起出现,而#include<iostream.h>时候就不需要std命名空间了。

再说一下如何定义自己的命名空间。

一般字节写namespace的时候如果是用模板,只能写在一个文件里面,这时候也不会出现定义冲突等问题。但是如果按一般的写成.h文件和.cpp文件,就需要注意一些细节问题。首先,在.h文件中定义namespace,这是肯定的,但是这时候的namespace中只能是声明,不能有定义,因为这是和普通的.h文件一样的,如果在.h文件中进行定义,那么在多个包含它的.cpp文件中就会报错,说重复定义。所以,.h文件中放声明,而把定义放在.cpp文件中。其次在.cpp中定义的时候一定要加上原来的命名空间,加入你定义了命名空间:namespace mm{},(注意后面没有分号,和类、结构体的定义不同),在.cpp中进行定义时,必须加上mm,如定义函数时,mm::fun(),定义变量时,int mm::a等。最后在其它文件中需要用的时候不但要加上#include"xxx.h",还需要加上,using namespace mm;,上面的三种说明方式都可以用。

下面是一个例子,可以帮助理解:

  1. //a.h文件  
  2. #ifndef __A_h__  
  3. #define __A_h__  
  4. namespace mm  
  5. {  
  6.     #include<iostream>  
  7.     using namespace std;  
  8.     void fun();  
  9.     class my{};  
  10.     extern int a,b;  
  11. }  
  12. #endif  
//a.h文件
#ifndef __A_h__
#define __A_h__
namespace mm
{
	#include<iostream>
	using namespace std;
	void fun();
	class my{};
	extern int a,b;
}
#endif
  1. //a.cpp文件  
  2. #include<iostream>  
  3. #include"a.h"  
  4. using namespace std;  
  5.   
  6. int mm::a=10;  
  7. int mm::b=20;  
  8.   
  9. void mm::fun()  
  10. {  
  11.     mm::my m;  
  12.     cout<<1<<2<<endl;  
  13. }  
//a.cpp文件
#include<iostream>
#include"a.h"
using namespace std;

int mm::a=10;
int mm::b=20;

void mm::fun()
{
	mm::my m;
	cout<<1<<2<<endl;
}

  1. //test.cpp文件  
  2. #include<iostream>  
  3. #include"a.h"  
  4. using namespace std;  
  5.   
  6. int main()  
  7. {  
  8.     mm::fun();  
  9.     system("pause");  
  10.     return 0;  
  11. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值