现在的位置: 首页 > 综合 > 正文

namespace的用法

2013年05月27日 ⁄ 综合 ⁄ 共 4416字 ⁄ 字号 评论关闭

C++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序的方便,必需使用同一名字。比如你定义了一个变量string user_name, 有可能在你调用的某个库文件或另外的程序代码中也定义了相同名字的变量,这就会出现冲突。命名空间就是为解决C++中的变量、函数的命名冲突而服务的。解决的办法就是将你的strTemp变量定义在一个不同名字的命名空间中。就好像张家有电视机,李家也有同样型号的电视机,但我们能区分清楚,就是因为他们分属不同的家庭。


例如:

#include <iostream>
#include <string>
using namespace std;


//using namespace编译指示,使在C++标准类库中定义的名字在本程序中可以使用
//否则,iostream,string 等c++标准类就不可见了,编译就会出错。
//两个在不同命名空间中定义的名字相同的变量

namespace myown1{
    string user_name = "myown1";
}

namespace myown2{
    string user_name = "myown2";
}

int main()
{
    cout<< "/n"
    << "Hello, " 
    << myown1::user_name //用命名空间限制符myown1访问变量user_name
    << "... and goodbye!/n";

    cout<< "/n"
    << "Hello, " 
    << myown2::user_name //用命名空间限制符myown2访问变量user_name
    << "... and goodbye!/n";

    return 0;
}

  当然,我们也可以使用程序开头的预编译指示来使用命名空间中的名字。使用预编译指示的好处在于在程序中不必显式地使用命名空间限制符来访问变量。以上主程序可修改为:

int main()
{
    using namespace myown1;
    cout<< "/n"
    << "Hello, " 
    << user_name 
    << "... and goodbye!/n";

    // using namespace myown2;
    cout<< "/n"
    << "Hello, " 
    << myown2::user_name //用命名空间限制符myown2访问变量user_name
    << "... and goodbye!/n";

    return 0;
}

但第二个变量必需用命名空间限制符来访问,因为此时myown1空间中的变量已经可见,如果不加限制,编译器就会无法识别是那一个命名空间中的变量。这一点一定要注意。

转自:http://www.cnblogs.com/CBDoctor/archive/2011/12/05/2276563.html


一 :

<iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。 

后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 

因 此,

当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现

当使 用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout

二:

所谓namespace,是指标识符的各种可见范围。

C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

1、直接指定标识符。

例如std::ostream而不是ostream。完整语句如下:

std::cout << std::hex << 3.4 << std::endl;

2、使用using关键字。

using std::cout;
using std::endl;

以上程序可以写成

cout << std::hex << 3.4 << endl;

3、最方便的就是使用using namespace std;

例如:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:

cout << hex << 3.4 << endl;

因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准 库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下 的。  

         所以就有了<iostream.h>和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。

命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"


转自:http://fangjian0518.blog.163.com/blog/static/55919656201110710422127/



命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个任务中的所有类声明放在同一个命名空间中。标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构、类和函数等)都被定义在命名空 间std(standard标准)中了。

定义命名空间

有两种形式的命名空间——有名的和无名的。
命名空间的定义格式为:(取自C++标准文档)
named-namespace-definition:
       namespace identifier { namespace-body }
unnamed-namespace-definition:
       namespace { namespace-body }
namespace-body:
       declaration-seqopt
--------------------------------------------------
有名的命名空间:
       namespace 命名空间名 {
              声明序列可选
       }
无名的命名空间:
       namespace {
              声明序列可选
       }
-------------------------------------------------
命名空间的成员,是在命名空间定义中的花括号内声明了名称。可以在命名空间的定义内,定义命名空间 的成员(内部定义)。也可以只在命名空间的定义内声明成员,而在命名空间的定义之外,定义命名空间的成员(外部定义)。
命名空间成员的外部定义的格式为:
命名空间名::成员名 ……
例如:

// out.h
namespace Outer { // 命名空间Outer的定义
       int i; // 命名空间Outer的成员i的内部定义
       namespace Inner { // 子命名空间Inner的内部定义
              void f() { i++; } // 命名空间Inner的成员f()的内部定义,其中的i为Outer::i
              int i;
              void g() { i++; } // 命名空间Inner的成员g()的内部定义,其中的i为Inner::i
              void h(); // 命名空间Inner的成员h()的声明
       }
       void f(); // 命名空间Outer的成员f()的声明
       // namespace Inner2; // 错误,不能声明子命名空间
}
void Outer::f() {i--;} // 命名空间Outer的成员f()的外部定义
void Outer::Inner::h() {i--;} // 命名空间Inner的成员h()的外部定义
// namespace Outer::Inner2 {} // 错误,不能在外部定义子命名空间

注意:
不能在命名空间的定义中声明(另一个嵌套的)子命名空间,只能在命名空间的定义中定义子命名空间。
也不能直接使用“命名空间名::成员名 ……”定义方式,为命名空间添加新成员,而必须先在命名空间的定义中添加新成员的声明。另外,命名空间是开放的,即可以随时把新的成员名称加入到已有的命 名空间之中去。方法是,多次声明和 定义同一命名空间,每次添加自己的新成员和名称。例如:

namespace A {
       int i;
       void f();
} // 现在A有成员i和f()
namespace A {
       int j;
       void g();
} // 现在A有成员i、f()、j和g()

还可以用多种方法,来组合现有的命名空间,让它们为我所用。例如:

namespace My_lib {
       using namespace His_string;
       using namespace Her_vector;
       using Your_list::List;
       void my_f(String &, List &);
}
……
using namespace My_lib;
……
Vector<String> vs[5];
List<int> li[10];
my_f(vs[2], li[5]);

为了省去每次调用Inner成员和标准库的函数和对象时,都要添加Outer::Inner::和 sta::的麻烦,可以使用标准C++的using编译指令来简化对命名空间中的名称的使用。格式为:
using namespace 命名空间名[::命名空间名……];
在这条语句之后,就可以直接使用该命名空间中的标识符,而不必写前面的命名空间定位部分。因为 using指令,使所指定的整个命名空间中的所有成员都直接可用。例如:

// out2.cpp
#include "out.h"
#include <iostream>
// using namespace Outer; // 编译错误,因为变量i和函数f()有名称冲突
using namespace Outer::Inner;
using namespace std;
int main ( ) {
       Outer::i = 0;
       Outer::f(); // Outer::i = -1;
       f(); // Inner::f(),Outer::i = 0;
       i = 0; // Inner::i
       g(); // Inner::g(),Inner::i = 1;
       h(); // Inner::h(),Inner::i = 0;
       cout << "Hello, World!" << endl;
       cout << "Outer::i = " << Outer::i << ", Inner::i = " << i << endl;
}

转自:http://blog.sina.com.cn/s/blog_986c99d601010hiv.html






抱歉!评论已关闭.