C++命名空间与头文件的关系:
(一)添加一个头文件demonamespace.h,内容如下
#ifndef DEMONAMESPACE_H_
#define DEMONAMESPACE_H_
class A
{
public:
int value;
};
namespace mynp
{
A ma;
}
#endif /* DEMONAMESPACE_H_ */
代码(1):
//只添加了头文件
#include "demonamespace.h"
int main() {
//很显然接下来的语句存在错误,解决方法是(1)修改为mynp::ma.value=2;(2)添加命名空间//mynp,即加上一行代码using namespace mynp;(可使用缩写方式using mynp)
ma.value=2;
return 0;
}
编译报错提示:'ma' was not declared in this scope
代码(2):
//只添加了命名空间
using namespace mynp;
int main() {
ma.value=2; //很显然,头文件都没有指明,编译器不会知道mynp的来源
return 0;
}
编译报错提示:
expected nested-name-specifier before 'mynp'
'mynp' has not been declared
'ma' was not declared in this scope
//若在主文件中添加一个命名空间mynp,则可以调用mynp中内容,但该mynp不是头文件demonamespace.h中的mynp如:
namespace mynp
{
int i;
}
using namespace mynp;
int main() {
i=2;
return 0;
}
(三)添加另一个头文件secondnamespace.h,内容如下:
#ifndef SECONDNAMESPACE_H_
#define SECONDNAMESPACE_H_
class B
{
public:
int value;
};
namespace mynp //与demonamespace.h中的mynp同名
{
B mb;
}
#endif /* SECONDNAMESPACE_H_ */
主文件替换为:
#include "demonamespace.h"
#include "secondnamespace.h"
using namespace mynp; //指明将两个头文件的mynp都添加进来
int main() {
ma.value=2;
mb.value=3;
return 0;
}
同时将两个头文件中的mynp添加到了主文件
****************************************************************
(四)测试,对于#include<iostream>和using namespace std;在主文件只添加其一,编译报错提示和(二)相同,经查资料,头文件iostrem中包含了一个namespace std;特别地头文件string中也有一个namespace std;当同时将iostream和string添到同一文件,是允许的,此时的情形和(三)相同。