我查看了一下C++中的头文件(这里是不包含.h的模板头文件,关于头文件的组织形式,可以参考:C语言中关于.h和.c的问题和.h文件和.cpp文件组织结构),在C++的标准头文件中,都有_STD_BEGIN作为开头,然后用_STD_END作为结尾,中间包含了文件的声明和定义。而_STD_BEGIN和_STD_END是宏定义,如下:
- #define _STD_BEGIN namespace std {
- #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;,上面的三种说明方式都可以用。
下面是一个例子,可以帮助理解:
- //a.h文件
- #ifndef __A_h__
- #define __A_h__
- namespace mm
- {
- #include<iostream>
- using namespace std;
- void fun();
- class my{};
- extern int a,b;
- }
- #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
- //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;
- }
//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;
}
- //test.cpp文件
- #include<iostream>
- #include"a.h"
- using namespace std;
- int main()
- {
- mm::fun();
- system("pause");
- return 0;
- }