C++匿名名字空间

转自:http://blog.csdn.net/eric_arrow/article/details/8978905

名字空间(namespace),是C++提供的一个解决符合名字冲突的特性。标准规定,在不同名字空间中命名相同的符号,代表不同的实体。通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间的相互影响。

通常定义一个名为MyNameSpace的名字空间,其形式为:

1namespace MyNameSpace

2{

3}

如果不写MyNameSpace,在C++里也是允许的,这就是匿名名字空间。按照标准的描述,匿名名字空间等价于:

1namespace unique

2{

3}

4usingnamespace unique;

这里的unique由编译器决定,并保证这是一个在程序里唯一的名字空间。

因此,可以看出,匿名名字空间具有一个很有用的特性,那就是,对于不同的编译单元(cpp文件),“同一个”匿名名字空间中的对象,会被当作不同的实体。而这个特性和全局的static修饰是一致的。那这能带来什么好处呢?原有的static不是很好用的吗?

是的,static修饰,在处理函数和变量(包括常量)的时候已经工作得很好了。但是static的缺陷是不能修饰class和struct这样的结构定义。因此,当出现这种情况:
在某个cpp实现里需要辅助的几个结构a,b,c来帮助实现,但是又不希望这些结构污染整个名字空间。这时一般有如下两种解决办法:

1)定义一个不常用的名字空间,将a, b, c 放入其中。

这样,需要程序员自己保证名字空间的名字唯一。

2)使用类内部结构体定义。

这样,如果结构比较复杂,比如,有静态成员,就行不通了。而且如果这些结构不是一个类独自使用而需要几个类共享,处理起来也比较麻烦。

这时,如果使用匿名名字空间,就可以比较完美解决问题了。

【总结】: 匿名名字空间提供了类似在全局函数前加 static 修饰带来的限制作用域的功能。它的这种特性可以被用在struct和class上, 而普通的static却不能。

原文地址:https://www.cnblogs.com/azbane/p/8527676.html

时间: 2024-11-09 02:20:44

C++匿名名字空间的相关文章

C++名字空间详解

代码编译运行环境:VS2012+Win32+Debug 1.名字空间的由来 名字空间(namespace)是由标准C++引入的,是一种新的作用域级别.原来C++标识符的作用域分为三级:代码块({-}和函数体).类域和全局作用域.如今,在类作用域和全局作用域之间,C++标准又添加了名字空间域这一个作用域级别. 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突. 2.名字空间的作用 名字空间的作用主要是为了解决日益严重的名称冲突问题.随着可重用代码的增多,各种不同的

c++名字空间,C与C++字符串的区别,枚举类型

1:命名空间2:C与C++字符串的区别和基本操作3:枚举类型命名空间#include <string> #include <ctype.h> #include <vector> #include <iostream> #include <fstream> // using declarations states our intent to use these names from the namespace std using namespace

C++名字空间/C++命名空间

0.序言 名字空间是C++提供的一种解决符号名字冲突的方法. 一个命令空间是一个作用域,在不同名字空间中命名相同的符号代表不同的实体. 通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间的相互影响. 1.名字空间的成员 定义在名字空间中的实体称为名字空间的成员. 名字空间内的名字可以被该名字空间内的其他成员直接访问,名字空间外的代码必须指定该名字位于哪个名字空间. 一个名字空间可以包含多种类型的标识符,如下面所列: 变量.常量.函数.结构体/联合体/枚举.类.嵌套名字空间 名字空间

c++新增的名字空间namespace

其实c也有此名字空间的概念 防止命名冲突,尤其是大型程序里很有用,节省精力,以免出错.可以全部引进,可以引进部分,还可以一个都不用.无所谓. using namespace std;  //标准库的名字都放在std里面 1 #include <iostream> 2 #include <string> 3 using namespace std;//标准库里的东西都可以用了.一劳永逸的方法 4 int main() 5 { 6 cout << "请输入姓名:&

ISO/IEC 9899:2011 条款6.2.3——标识符的名字空间

6.2.3 标识符的名字空间 1.如果一个特定标识符的多个声明在一个翻译单元的任意一点可见,那么语法上下文会区分对不同实体的引用.从而,对于标识符各种不同的类别具有独立的名字空间: ——标签名(通过标签声明和使用的语法进行区分): ——结构体.联合体以及枚举的类型名(通过关键字struct.union或enum进行区分): ——结构体或联合体的成员:每个结构体或联合体为其成员具有一个独立的名字空间(通过用于访问成员的.或是->操作符的表达式类型进行区分): ——所有其它标识符称为普通标识符(声明

名字空间和异常

那年是787年!公元?--Monty Python 任何规则都不可能如此一般,以至不能容许任何例外(异常).--Bobert Burton 1.模块化和界面 任何实际程序都是由一些部分组成的.例如,最简单的" Hello, world! "程序也涉及到至少两部分:用户代码要求将Hello, world!打印出来,I/O系统完成打印工作. 当一个模块使用另一个模块时,它并不需要知道有关被用模块的所有东西.理想的情况是,一个模块的大部分细节都不为其使用都所知.为此,我们就需要将一个模块和它

iOS: 学习笔记, Swift名字空间

在Swift中, 名字空间是用class(extension)嵌套来实现的, 以下用一个简单样例来进行展示 // // main.swift // SwiftNameSpace // // Created by yao_yu on 14-8-1. // Copyright (c) 2014年 yao_yu. All rights reserved. // // Swift名字空间使用实例 // import Foundation //定义顶层名字空间 class YY{ } //在YY名字空间中

未命名名字空间

未命名的名字空间 我们或许希望所定义的对象.函数.类类型或其他实体,它只在程序的一小段代码中可见,因为这样可以更进一步地缓解名字空间污染问题,因为我们知道该实体只 被用在很有限的地方,所以可能不想再花费太多努力来保证这个实体有惟一的名字而不会与程序其他地方声明的名字冲突.当我们在一个函数或嵌套块中声明一个对 象时,由该声明引入的名字只在声明它的块中可见,但是,如果程序员想让一个实体被多个函数使用,而又不想让该名字在整个程序中可用 又该怎么办呢? 例如 假设我们想实现一组排序函数,对 double

C++笔记--名字空间和异常

名字空间 成员函数可以在名字空间的定义里去声明,然后再去采用一种定义方式例如:namespace__name::member_name的方式去定义这个成员函数 1 namespace parser{ 2 double prim(bool); 3 double term(bool); 4 } 5 6 double parser::prim(bool get){/*定义*/} 7 double parser::term(bool get){/*定义,这些定义式定义在命名空间之外的*/} 名字空间中的