C++中namespace的使用
定义命名空间
有两种形式的命名空间——有名的和无名的。
命名空间的定义格式为:(取自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]);
使用命名空间
作用域解析运算符(::)
对命名空间中成员的引用,需要使用命名空间的作用域解析运算符::。例如:
// out1.cpp
#include "out.h"
#include
<iostream>
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指令(using namespace)
为了省去每次调用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;
}
C++中namespace的使用的更多相关文章
- django2中namespace和name的使用
django2中namespace和name的使用 一.在Django <= 1.11 我们通过关键词namespace参数定义名称空间 1.projects/urls.py from ...
- unity3d中namespace的使用注意问题
最近在重构游戏中的老一套逻辑,同时要加入新的功能逻辑,因为各种命名问题,就使用namespace进行控制.但是namespace在unity3d引擎中的使用与一般不同,需要注意一点:要作为Compon ...
- 关于js中namespace命名空间模式
命名空间有助于减少程序中所需要的全局变量的数量,并且同时有助于避免命名冲突或过长的名字前缀. 关于命名空间的例子: /** * 创建全局对象MYAPP * @module MYAPP * @title ...
- PHP中namespace和use使用详解
来源于:http://www.jb51.net/article/36389.htm 命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种 ...
- Linux内核中namespace之PID namespace
前面看了LInux PCI设备初始化,看得有点晕,就转手整理下之前写的笔记,同时休息一下!!~(@^_^@)~ 这片文章是之前写的,其中参考了某些大牛们的博客!! PID框架的设计 一个框架的设计会考 ...
- web.config中namespace的配置(针对页面中引用)
1,在页面中使用强类型时: @model GZUAboutModel @using Nop.Admin.Models//命名空间(注意以下) 2,可以将命名空间提到web.config配置文件中去,此 ...
- 46. Ext中namespace的作用(转)
转自:https://www.cnblogs.com/givemeanorange/p/5569954.html Ext中在每一个页面中添加一个namespace呢,就像下面的代码: // creat ...
- django 中namespace的问题
在早期的django版本中 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^polls/', include('polls.urls' ...
- php5.3中namespace的说明,帮助初次接触namespace的phper快速理解
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀,但是方法名变的很长 ...
随机推荐
- laravel中的attach and detach toggle method
创建模型 post and user 以及 users , posts ,user_post(favorities)测试数据 在此可以看上一篇中的数据,本次测试数据利用的上一篇的数据.detach ...
- 列表推导式对比For循环执行效率
我们在前面的学习中都知道,如果把1-10以内的元素追加到一个新的列表表中,如果使用for循环我们可以这么做: a = [] for i in range(1,11): a.append(i) prin ...
- 编写高质量代码改善C#程序的157个建议——建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的
建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的 在建议50中,我们将C#中的类型分为:普通类型和继承了IDisposable接口的非普通类型.非普通类型除了包含那些托管资源的类型外, ...
- [Lua快速了解一下]Lua的语法
-注释 -- 两个减号是行注释 -块注释 --[[ 这是块注释 这是块注释 --]] -变量 Lua的数字只有double型,64bits, Lua的字符串string支持双引号或者单引号 以下例子会 ...
- Python - selenium_WebDriver 鼠标键盘事件
from selenium import webdriver #引入ActionChains类 提供了鼠标的操作方法 from selenium.webdriver.common.action_cha ...
- PrintDocument or PrintPreviewDialog 打印
/// <summary> /// /// </summary> /// <param name="sender"></param> ...
- 基于任务的异步编程模式(TAP)
异步编程是C#5.0的一个重要改进,提供两个关键字:async和await.使用异步编程,方法的调用是在后台运行(通常在线程或任务的帮助下),但不会阻塞调用线程.异步模式分为3种:异步模式.基于事件的 ...
- 将某个类封装成XML形式返回
<?xml version="1.0" encoding="GBK" standalone="no"?><package& ...
- Kotlin when 流程判断
如果学过C或者java C#等语言. 一定熟悉SWITCH这个流程判断 但是在kotlin中却没有这个.而是 使用了When来代替. 当什么时候. 下面我觉一个简单的例子: import java.u ...
- char *p="abc" 与 char p[]="abc" 的区别
本文来源于网络 出处:点我 有这样一段代码: #include "stdio.h" char *get_string_1() { char p[] = "hello wo ...