Chinaunix首页 | 论坛 | 博客
  • 博客访问: 532209
  • 博文数量: 104
  • 博客积分: 2089
  • 博客等级: 大尉
  • 技术积分: 1691
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-29 08:48
文章分类

全部博文(104)

文章存档

2015年(1)

2013年(13)

2012年(31)

2011年(59)

分类: C/C++

2011-12-15 09:32:34

内容
匿名空间,匿名类,匿名联合体,匿名结构体。

匿名空间
  1. #include <stdio.h>

  2. namespace A {
  3.         int ID = 1;
  4. }
  5. namespace {
  6.         int ID = 11;
  7. }

  8. namespace B {
  9.         int ID = 21;
  10. }

  11. int main(void){
  12.         printf("ID %d \n",ID);
  13. }
输出
  1. ID 11
这里用到是C的函数,减少std空间的干扰。这里输出的是匿名空间的内容。
那么就类似于如下用法
  1. namespace __UNIQUE_NAME_ {
  2.  int ID;
  3. }
  4.  using namespace __UNIQUE_NAME_;
如果修改代码如下
  1. #include <stdio.h>

  2. namespace A {
  3.         int ID = 1;
  4. }
  5. namespace {
  6.         int ID = 11;
  7. }

  8. namespace B {
  9.         int ID = 21;
  10. }
  11. namespace {
  12.         int ID = 41;
  13. }

  14. int main(void){
  15.         printf("ID %d \n",ID);
  16. }
编译报错,如下
  1. t_anonymity_space.cpp:14: error: redefinition of ‘int ::ID’
  2. t_anonymity_space.cpp:7: error: ‘int ::ID’ previously defined here
在不同的文件中呢
  1. //file def.h
  2. namespace {
  3.         int ID = 41;
  4. }
  1. #include <stdio.h>
  2. #include "def.h"
  3. namespace A {
  4.         int ID = 1;
  5. }
  6. namespace {
  7.         int ID = 11;
  8. }

  9. namespace B {
  10.         int ID = 21;
  11. }

  12. int main(void){
  13.         printf("ID %d \n",ID);
  14. }
编译报错
  1. t_anonymity_space.cpp:7: error: redefinition of ‘int ::ID’
  2. def.h:3: error: ‘int ::ID’ previously defined here
这里说明匿名namespace是在一个空间里。

引用其他空间以后的用法
  1. #include <stdio.h>
  2. namespace A {
  3.         int ID = 1;
  4. }
  5. namespace {
  6.         int ID = 11;
  7. int id = 12;
  8. }

  9. namespace B {
  10.         int ID = 21;
  11. }

  12. int main(void){
  13.         printf("ID %d \n",ID);

  14.         using namespace A;
  15.         printf("ID %d - %d - %d \n",A::ID, ::ID, id);

  16. }
输出
  1. ID 11
  2. ID 1 - 11 - 12
引用了其他空间,并且此时此时如果使用

匿名空间都是在同一个空间,并且同名的必须加上::加以区分。
我在这里猜测一下,全局变量是不是就是在默认的匿名空间的呢?从现象来看,八成是。

挺多的,匿名联合体和结构体放在另一篇吧


参考:
  1. C++匿名命名空间 http://blog.csdn.net/fxpbupt/article/details/5600937

阅读(1300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~