首页 新闻 会员 周边 捐助

c++命名空间

0
悬赏园豆:20 [已解决问题] 解决于 2014-06-21 17:29

c++写的太少,对命名空间有些疑问。是这样的,我就直接用一个简单的例子说明了:

首先看普通的函数,这里有2个文件,首先是文件1.h

1 #ifndef __1__H__
2 #define __1__H__
3 
4 namespace hw {
5     int max(int a, int b);
6 }
7 #endif

然后是1.cpp:函数的实现中,对于命名空间用下面2种方式

 1 #include "1.h"
 2 //方式1
 3 namespace hw {
 4     int max(int a, int b)
 5     {
 6         return a>b?a:b;
 7     }
 8 }
 9 
10 //方式二
11 //using namespace hw;
12 //int max(int a, int b)
13 //{
14 //    return a>b?a:b;
15 //}

然后是测试代码:

1 #include "1.h"
2 using namespace hw;
3 int main(int argc, char *argv[])
4 {
5     int n1 = 1, n2 = 2;
6     int n = max(n1, n2);
7 }

编译时,方式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实现时,可以使用命名空间,而普通函数一定要再次用命名空间包括起来呢?不知道我表达清楚了没有

c++
钱吉的主页 钱吉 | 初学一级 | 园豆:123
提问于:2014-06-13 15:40
< >
分享
最佳答案
0

函数例子中的方法2,max被定义在匿名命名空间里面。using namespace的意思是,搜索符号时同时尝试从这个namespace里查找这个符号。而在定义符号的时候,不会去查找这个namespace。在这个例子里面的1.h只是进行了一个声明,而没有定义max这个符号。而main函数所需要的hw::max则没有定义。

类的例子当中,maxclass已经在hw这个namespace进行了定义。在源文件中视图定义maxclass::max的时候,编译器试图确认这边的maxclass具体所指是什么,在当前namespace下没有找到,而在hw这个namespace找到了定义。

收获园豆:20
deltamaster | 菜鸟二级 |园豆:229 | 2014-06-15 14:21

谢谢回答,贴了几天了,终于有人回答了。同样的帖子发到CSDN,1天之内回复了好几条,看来博客园还是人气不足啊。

其实这几天我自己已经找到答案了。简单一点说就是:using namespace xx 只是告诉编译器去xx这个命名空间中寻找声明,要定义的话必须用namespace包括进来。至于类,因为本身就是一个命名空间,在cpp文件中class::member()其实就是用命名空间包括的一种定义。

钱吉 | 园豆:123 (初学一级) | 2014-06-15 14:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册