c++命名空间

钱吉 2014-06-13 10:23:21
c++写的太少,对命名空间有些疑问。是这样的,我就直接用一个简单的例子说明了:
首先看普通的函数,这里有2个文件,首先是文件1.h
#ifndef __1__H__
#define __1__H__

namespace hw {
int max(int a, int b);
}
#endif

然后是1.cpp:函数的实现中,对于命名空间用下面2种方式
 #include "1.h"
//方式1
namespace hw {
int max(int a, int b)
{
return a>b?a:b;
}
}

//方式二
//using namespace hw;
//int max(int a, int b)
//{
// return a>b?a:b;
//}

然后是测试代码:
 #include "1.h"
using namespace hw;
int main(int argc, char *argv[])
{
int n1 = 1, n2 = 2;
int n = max(n1, n2);
}

编译时,方式1成功编译,而方式2对给出链接错误。为什么呢?
**************************************************
接着我把普通函数换成类:
#ifndef __1__H__
#define __1__H__

namespace hw {

class maxclass
{
public:
int max(int a, int b);
};
}
#endif
#include "1.h"
using namespace hw;
int maxclass::max(int a, int b)
{
return a>b?a:b;
}
#include "1.h"
using namespace hw;
int main(int argc, char *argv[])
{
int n1 = 1, n2 = 2;

maxclass t;
int nn = t.max(n1, n2);
return 0;
}

结果是成功编译,为什么类的cpp实现时,可以使用命名空间,而普通函数一定要再次用命名空间包括起来呢?不知道我表达清楚了没有
...全文
221 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmqmjy 2014-06-18
  • 打赏
  • 举报
回复
打错几个字,重新编辑一下 普通函数的定义也是声明。 所以在第一个例子中,cpp文件的方式二声明并定义了一个全局空间的max函数。 而头文件声明了hw空间的一个max函数(没有定义),二者没关系。 而类定义之外的成员函数实现是定义不是声明。 第二个例子中cpp文件的maxclass::max函数只是定义,没有声明。 编译器必须找到该函数的声明。 首先试图在全局空间里找,但是找不到。 然后根据using namespace在hw空间里找,结果找到了。 所以头文件的max函数变成了cpp文件maxclass::max的声明。 所以maxclass::max是属于hw名字空间的,全局空间没有这个函数。 main函数包含了头文件并使用using namespace。 maxclass:max函数可以找到其声明及定义hw::maxclass:max。 而max函数只能找到声明hw::max,没有定义,所以链接出错。
taodm 2014-06-18
  • 打赏
  • 举报
回复
没有一本教材可以讲全C++,除了多看书就多看书啊。 学好C++,需要看的书厚度加起来得超半米。
引用 4 楼 lovewubo 的回复:
[quote=引用 1 楼 taodm 的回复:] 因为你没有试namespace里套namespace的情况。 你的教材也没告诉你,class自己是一个namespace。
谢谢。请问下这些教材没有告诉的内容,你是怎么学习到的?share一下吧[/quote]
mmqmjy 2014-06-18
  • 打赏
  • 举报
回复
普通函数的定义也是声明。 所以在第一个例子中,方式二声明并定义了一个全局空间的max函数。 而头文件定义了hw空间的一个max函数(没有实现),二者没关系。 而类定义之外的成员函数实现不是声明。 第二个例子中的maxclass::max函数只是定义,没有声明。 编译器必须找到该函数的声明。 首先试图在全局空间里找,但是找不到。 然后根据using namespace在hw空间里找,结果找到了。 所以头文件的max函数变成了c文件maxclass::max的声明。 所以maxclass::max是属于hw名字空间的,全局空间没有这个函数。
buyong 2014-06-18
  • 打赏
  • 举报
回复
引用 4 楼 lovewubo 的回复:
[quote=引用 1 楼 taodm 的回复:] 因为你没有试namespace里套namespace的情况。 你的教材也没告诉你,class自己是一个namespace。
谢谢。请问下这些教材没有告诉的内容,你是怎么学习到的?share一下吧[/quote] class自己是一个namespace?? 这话谁说的?那他为什么叫class?
Falleyes 2014-06-14
  • 打赏
  • 举报
回复
方式二中你只是using这个命名空间,让命名空间内成员访问范围达到Using的作用域。这样的话,你只是提供了两个版本的max函数,一个是命名空间下的,一个是普通成员函数。如果要定义命名空间成员,或者扩充命名控件,则一定要使用namespace T{}的形式在花括号内写定义或扩充的内容。 using只是改变作用范围。 测试成功的,因为类也是作用域,你是用using使得类可以访问,然后可以使用代码中的::方式对类成员进行定义。还记得::的名字是什么吗?作用域限定符。如果你不用::那么依旧会出现两个重载版本,类中的那个依旧没有定义。
钱吉 2014-06-14
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
因为你没有试namespace里套namespace的情况。 你的教材也没告诉你,class自己是一个namespace。
谢谢。请问下这些教材没有告诉的内容,你是怎么学习到的?share一下吧
钱吉 2014-06-14
  • 打赏
  • 举报
回复
谢谢楼上的两位,我明白了。直接贴代码说明:
#ifndef __1__H__
#define __1__H__

namespace hw {
	int max(int a, int b);

	class maxclass
	{
	public:
		int max(int a, int b);
	};
}
#endif
#include "1.h"
//方式1::正确
//namespace hw {
//	int max(int a, int b)
//	{
//		return a>b?a:b;
//	}
//}

//方式二::链接错误
//using namespace hw;
//int max(int a, int b)
//{
//	return a>b?a:b;
//}

//方式三::正确
int hw::max(int a, int b)
{
	return a>b?a:b;
}

//类定义
//方式一::正确
//using namespace hw;
//int maxclass::max(int a, int b)
//{
//	return a>b?a:b;
//}

//方式二::正确
int hw::maxclass::max(int a, int b)
{
	return a>b?a:b;
}
#include "1.h"
int main(int argc, char *argv[])
{
	//方式一
	//using namespace hw;
	//int n1 = 1, n2 = 2;
	//int n = max(n1, n2);

	//maxclass t;
	//int nn = t.max(n1, n2);

	//方式二
	int n1 = 1, n2 = 2;
	int n = hw::max(n1, n2);

	hw::maxclass t;
	int nn = t.max(n1, n2);

	return 0;
}
taodm 2014-06-13
  • 打赏
  • 举报
回复
因为你没有试namespace里套namespace的情况。 你的教材也没告诉你,class自己是一个namespace。

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧