c++ anonymous namespace -- 匿名空间

匿名空间,匿名类,匿名联合体,匿名结构体。
 
匿名空间
 
  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
引用了其他空间,并且此时此时如果使用
 
匿名空间都是在同一个空间,并且同名的必须加上::加以区分。
我在这里猜测一下,全局变量是不是就是在默认的匿名空间的呢?从现象来看,八成是。

c++ anonymous namespace -- 匿名空间的更多相关文章

  1. anonymous namespace V.S. static variant

    [anonymous namespace V.S. static variant] 在C语言中,如果我们在多个tu(translation unit)中使用了同一个名字做为函数名或者全局变量名,则在链 ...

  2. Kubernetes K8S之Pod跨namespace名称空间访问Service服务

    Kubernetes的两个Service(ServiceA.ServiceB)和对应的Pod(PodA.PodB)分别属于不同的namespace名称空间,现需要PodA和PodB跨namespace ...

  3. scoping作用域,anonymous function匿名函数,built-in functions内置函数

    作用域练习1 def test1(): print('in the test1') def test(): print('in the test') return test1 res = test() ...

  4. c++ 的namespace及注意事项

    前文 下文中的出现的"当前域"为"当前作用域"的简写 namepsace在c++中是用来避免不同模块下相同名字冲突的一种关键字,本文粗略的介绍了一下namesp ...

  5. C++ 匿名名字空间及静态非成员函数

    在C++中,static有一个感觉被较少提及的用法:修饰非成员函数,这个用法实际是从C语言继承来的.其作用是表明这个函数只在当前编译单元中有效.这就使这个函数的所有引用在编译时就可以全部确定,无需进入 ...

  6. 【转】利用匿名namespace解决C++中重复定义的问题

    目录 利用匿名namespace解决C++中重复定义的问题 原文:https://blog.csdn.net/pi9nc/article/details/11267031 利用匿名namespace解 ...

  7. ASP.NET MVC3控制器传递匿名对象到视图实例

    ASP.NET MVC3 + Entity Framework项目中,从控制器传递匿名对象到视图非常常见,原本以为用dynamic能轻松搞定,最后发现我错了: Controller:  代码如下 复制 ...

  8. C++匿名命名空间

    当定义一个命名空间时,可以忽略这个命名空间的名称:      namespce {          char c;          int i;          double d;      } ...

  9. namespace、struct、enum、union、string(day01)

    一 C++概述 C++历史背景 )C++的江湖地位 jave C C++ C# python )C++之父:Bjarne Stroustrup(--) ,Cpre,为C语言增加类的机制 ,Bjarne ...

随机推荐

  1. 斯坦福大学IOS开发课程笔记(第七课第一部分)

    转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/31462099 作者:小马 这节课的内容太多,分两部分介绍.本节课主要是介绍怎样开发 ...

  2. mysql 参数optimizer_switch

    mysql 5.1中开始引入optimizer_switch, 控制mysql优化器行为.他有一些结果集,通过on和off控制开启和关闭优化器行为.使用有效期全局和会话两个级别,在5.5中optimi ...

  3. Java 判断多级路径是否存在,不存在就创建

    第一种方案: /** * 是否创建目录 * @param path * @return */ public boolean isexitsPath(String path)throws Interru ...

  4. 自定义的Server

    自定义的Server 我们在上面对ASP.NET Core默认提供的具有跨平台能力的KestrelServer进行了详细介绍(<聊聊ASP.NET Core默认提供的这个跨平台的服务器——Kes ...

  5. 不可表示的数[x/2] + y + x * y

    前端是时间在庞果网上看到不可表示的数的编程题(如下),我自己也试着解答了一下,写的算法虽然没有没有错,但是跑了一些还只是跑到a8,后来到自己整理一下网上的解答过程,虽然解答写的很清晰,但是有些知识还是 ...

  6. 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系

    (1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器能够自己定义不同的状态栏例如以下: -(BOOL)prefersStatusBa ...

  7. cocos2d-x游戏开发系列教程-坦克大战游戏之虚拟手柄的显示

    上篇文章我们有了坦克,但是没有手柄,无法控制坦克. 1.这篇我们编写虚拟手柄来控制坦克.头文件大致内容如下: #define RES_PADDLE_LEFT "paddle/left.png ...

  8. jquery mobile左右滑动切换页面

    jquery mobile左右滑动切换页面 $(function() {$("body").bind('swiperight', function() {  $.mobile.ch ...

  9. 一起C语言中程序时序问题的排查过程

    [文章摘要] 对于由多个模块协同工作的软件来说,程序处理的时序是很重要的.当消息处理的顺序出现混乱时,程序就会出现异常. 本文基于作者的实际项目经验.对软件模块之间的时序问题进行了具体的分析,为相关软 ...

  10. qtcreator +vs2013 开发xp下使用的程序

    在qtcreator 开发,使用vs2013的编辑器开发出来的exe不能在xp下使用, 只需要在pro文件添加 QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWS,5. ...