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实现时,可以使用命名空间,而普通函数一定要再次用命名空间包括起来呢?不知道我表达清楚了没有
函数例子中的方法2,max被定义在匿名命名空间里面。using namespace的意思是,搜索符号时同时尝试从这个namespace里查找这个符号。而在定义符号的时候,不会去查找这个namespace。在这个例子里面的1.h只是进行了一个声明,而没有定义max这个符号。而main函数所需要的hw::max则没有定义。
类的例子当中,maxclass已经在hw这个namespace进行了定义。在源文件中视图定义maxclass::max的时候,编译器试图确认这边的maxclass具体所指是什么,在当前namespace下没有找到,而在hw这个namespace找到了定义。
谢谢回答,贴了几天了,终于有人回答了。同样的帖子发到CSDN,1天之内回复了好几条,看来博客园还是人气不足啊。
其实这几天我自己已经找到答案了。简单一点说就是:using namespace xx 只是告诉编译器去xx这个命名空间中寻找声明,要定义的话必须用namespace包括进来。至于类,因为本身就是一个命名空间,在cpp文件中class::member()其实就是用命名空间包括的一种定义。