当前位置:文档之家› C 中的命名空间是什么

C 中的命名空间是什么

using namespace 命名空间名[::命名空间名……];
在这条语句之后,就可以直接使用该命名空间中的标识符,而不必写前面的命名空间定位部分。 因为 using 指令,使所指定的整个命名空间中的所有成员都直接可用。例如:
// out2.cpp #include "out.h" #include <iostream> // using namespace Outer; // 编译错误,因为变量 i 和函数 f()有名称冲突 using namespace Outer::Inner; using namespace std;
在所有命名空间之外,还存在一个全局命名空间,它对应于文件级的声明域。因此,在命名空间 机制中,原来的全局变量,现在被认为位于全局命名空间中。
标准 C++库(不包括标准 C 库)中所包含的所有内容(包括常量、变量、结构、类和函数等)都 被定义在命名空间 std(standard 标准)中了。
2)定义命名空间 有两种形式的命名空间——有名的和无名的。 命名空间的定义格式为:(取自 C++标准文档) named-namespace-definition: namespace identifier { namespace-body } unnamed-namespace-definition: namespace { namespace-body }
原来 C++标识符的作用域分成三级:代码块({……},如复合语句和函数体)、类和全局。现在, 在其中的类和全局之间,标准 C++又添加了命名空间这一个作用域级别。
命名空间可以是全局的,也可以位于另一个命名空间之中,但是不能位于类和代码块中。所以, 在命名空间中声明的名称(标识符),默认具有外部链接特性(除非它引用了常量)。
List<int> li[10];
my_f(vs[2], li[5]);
3)使用命名空间 <!--[if !supportLists]-->l <!--[endif]-->作用域解析运算符(::) 对命名空间中成员的引用,需要使用命名空间的作用域解析运算符::。例如: // out1.cpp #include "out.h" #include <iostream>
1)作用域与命名空间 <!--[if !supportLists]-->l <!--[endif]-->相关概念
与命名空间相关的概念有: <!--[if !supportLists]-->n <!--[endif]-->声明域(declaration region)—— 声明标识符 的区域。如在函数外面声明的全局变量,它的声明域为声明所在的文件。在函数内声明的局部变量, 它的声明域为声明所在的代码块(例如整个函数体或整个复合语句)。 <!--[if !supportLists]-->n <!--[endif]-->潜在作用域(potential scope)—— 从声明点 开始,到声明域的末尾的区域。因为 C++采用的是先声明后使用的原则,所以在声明点之前的声明域 中,标识符是不能用的。即,标识符的潜在作用域,一般会小于其声明域。 <!--[if !supportLists]-->n <!--[endif]-->作用域(scope)—— 标识符对程序可见的范围。 标识符在其潜在作用域内,并非在任何地方都是可见的。例如,局部变量可以屏蔽全局变量、嵌套层 次中的内层变量可以屏蔽外层变量,从而被屏蔽的全局或外层变量在其倍屏蔽的区域内是不可见的。 所以,一个标识符的作用域可能小于其潜在作用域。 <!--[if !supportLists]-->l <!--[endif]-->命名空间 命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个集 团的声明放在同一个命名空间中。
char func(char); class String { ... }; }
// somelib.h namespace SomeLib {
class String { ... }; }
现在就算在同一个程序中使用 String 类也不会发生冲突了,因为他们分别变成了:one::String() 以及 Somelib::String()
避免,在大规模程序的设计中,以及在程序员使用各种各样的 C++库时,这些标识符的命名发生冲突, 标准 C++引入了关键字 namespace(命名空间/名字空间/名称空间/名域),可以更好地控制标识符的 作用域。
MFC 中并没有使用命名空间,但是在.NET 框架、MC++和 C++/CLI 中,都大量使用了命名空间。
// 命名空间 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; // 错误,不能声明子命名空间 }
namespace-body: declaration-seqopt 即:(自己翻译并改写的)
有名的命名空间: namespace 命名空间名 {
// 声明序列可选 }
无名的命名空间: namespace {
// 声明序列可选 } 命名空间的成员,是在命名空间定义中的花括号内声明了的名称。可以在命名空间的定义内,定 义命名空间的成员(内部定义)。也可以只在命名空间的定义内声明成员,而在命名空间的定义之外, 定义命名空间的成员(外部定义)。 命名空间成员的外部定义的格式为: 命名空间名::成员名 …… 例如: // out.h namespace Outer {
这样,就可以通过声明命名空间来区分不同的类或函数等了。 比如 C++标准库定义了命名空间:std,其中包含容器 vector,示例如下: #include "stdafx.h" #include <vector> #include <iostream> #include <algorithm> using namespace std;
注意: (1)、不能在命名空间的定义中声明(另一个嵌套的)子命名空间,只能在命名空间的定义中定
义子命名空间。 (2)、也不能直接使用“命名空间名::成员名 ……”定义方式,为命名空间添加新成员,而必
须先在命名空间的定义中添加新成员的声明。 (3)、另外,命名空间是开放的,即可以随时把新的成员名称加入到已有的命名空间之中去。方
int main ( ) {
cout<<"4 not found "<<endl; else
cout<<"4 found "<<*it1<<endl; return 0;
}
输出结果为:4 found 4.
3、(本部分参考网页:/touzani/archive/2007/06/04/1637776.aspx) 在 C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了
namespace System {
// 符号定义,类型、变量、函数等。 }; 和类、结构类似,但不能实例化,只可以引用。
2、名字空间,说白了,就是一个区域, 为了防止命名冲突,可以保证,在某个名字空间里的命 名对象不会产生冲突。STd 就是这样的, 你<!--[if !supportLists]-->l <!--[endif]-->using 指令(using namespace)
为了省去每次调用 Inner 成员和标准库的函数和对象时,都要添加 Outer::Inner::和 sta::的麻 烦,可以使用标准 C++的 using 编译指令来简化对命名空间中的名称的使用。格式为:
int main ( ) {
Outer::i = 0; Outer::f(); // Outer::i = -1; Outer::Inner::f(); // Outer::i = 0; Outer::Inner::i = 0; Outer::Inner::g(); // Inner::i = 1; Outer::Inner::h(); // Inner::i = 0; std::cout << "Hello, World!" << std::endl; std::cout << "Outer::i = " << Outer::i << ", Inner::i = " << Outer::Inner::i << std::endl; }
using namespace His_string; using namespace Her_vector; using Your_list::List; void my_f(String &, List &); }
……
using namespace My_lib;
相关主题