C++匿名命名空间
2016-07-08 08:34
260 查看
原贴 请见 http://jinnsky2006.spaces.live.com/Blog/cns!27D75A3853CE1DBA!915.entry
当定义一个命名空间时,可以忽略这个命名空间的名称:
namespce {
char c;
int i;
double d;
}
编译器在内部会为这个命名空间生成一个唯一的名字,而且还会为这个匿名的命名空间生成一条using指令。所以上面的代码在效果上等同于:
namespace __UNIQUE_NAME_ {
char c;
int i;
double d;
}
using namespace __UNIQUE_NAME_;
在匿名命名空间中声明的名称也将被编译器转换,与编译器为这个匿名命名空间生成的唯一内部名称(即这里的__UNIQUE_NAME_)绑定在一起。还有一点很重要,就是这些名称具有internal链接属性,这和声明为static的全局名称的链接属性是相同的,即名称的作用域被限制在当前文件中,无法通过在另外的文件中使用extern声明来进行链接。如果不提倡使用全局static声明一个名称拥有internal链接属性,则匿名命名空间可以作为一种更好的达到相同效果的方法。
注意:命名空间都是具有external 连接属性的,只是匿名的命名空间产生的__UNIQUE_NAME__在别的文件中无法得到,这个唯一的名字是不可见的.
C++ 新的标准中提倡使用匿名命名空间,而不推荐使用static,因为static用在不同的地方,涵义不同,容易造成混淆.另外,static不能修饰class
当定义一个命名空间时,可以忽略这个命名空间的名称:
namespce {
char c;
int i;
double d;
}
编译器在内部会为这个命名空间生成一个唯一的名字,而且还会为这个匿名的命名空间生成一条using指令。所以上面的代码在效果上等同于:
namespace __UNIQUE_NAME_ {
char c;
int i;
double d;
}
using namespace __UNIQUE_NAME_;
在匿名命名空间中声明的名称也将被编译器转换,与编译器为这个匿名命名空间生成的唯一内部名称(即这里的__UNIQUE_NAME_)绑定在一起。还有一点很重要,就是这些名称具有internal链接属性,这和声明为static的全局名称的链接属性是相同的,即名称的作用域被限制在当前文件中,无法通过在另外的文件中使用extern声明来进行链接。如果不提倡使用全局static声明一个名称拥有internal链接属性,则匿名命名空间可以作为一种更好的达到相同效果的方法。
注意:命名空间都是具有external 连接属性的,只是匿名的命名空间产生的__UNIQUE_NAME__在别的文件中无法得到,这个唯一的名字是不可见的.
C++ 新的标准中提倡使用匿名命名空间,而不推荐使用static,因为static用在不同的地方,涵义不同,容易造成混淆.另外,static不能修饰class
相关文章推荐
- C语言运算符优先级 之 快速记忆
- c语言学习进程
- iOS-C语言-C语言的介绍以及第一个例子HelloWorld
- C++ 函数后加const
- VS2010 Win7 64位 C++ MFC DataGrid绑定实例
- C++ delete 和delete[] 的区别
- 再探C++Primer (5)const限定符
- 再探C++Primer(6) 标准库类型string、vector和迭代器
- OpenCV学习C++接口:图像遍历+像素压缩
- 一起talk C栗子吧(第一百七十三回:C语言实例--关闭终端中的缓冲功能一)
- C++ 最近面试题中遇到的一些问题
- 提高项目26.2-查成绩2
- 一个简单c语言windows程序的实现
- 查漏补缺——类(C++ Primer)
- C++ 读取 pcap文件
- 提高项目26.1-查成绩
- C语言中实现数组的动态增长
- 提高项目25.3选择排序
- C++sort函数的用法
- UVa1339(古老的密码)