没事研究下C#虚拟光驱,有所收获!它被定义了,但它却被定义为未定义——有趣的宏定义 前些日子为了弄清楚宏定义写了个小程序,忽然发现将标识符定义为空和将标识符定义为未定义完全是两码事…虚拟光驱…然后发现原来宏定义中还有一种状态叫“未定义”。下面就是那个小程序以及简单的分析,然后通过这个程序可以充分体验一下这个“未定义”的状态,体验一下什么叫“它被定义了,但它却被定义为未定义”。
程序源码:

view sourceprint?#include<stdio.h>

int main()

{

#if (A == B)

printf("define A = B/n");

#elif (A == C)

printf("define A = C/n");

#else

printf("nothing is defined!/n");

#endif

return 0;

}

然后下面是编译命令和运行结果:
[root@localhost test]# gcc definetest.c -o definetest
[root@localhost test]# ./definetest
define A = B
[root@localhost test]# gcc definetest.c -o definetest -DA
[root@localhost test]# ./definetest
nothing is defined!
[root@localhost test]# gcc definetest.c -o definetest -DA=C
[root@localhost test]# ./definetest
define A = B
[root@localhost test]# gcc definetest.c -o definetest -DA=C -DC
[root@localhost test]# ./definetest
define A = C
[root@localhost test]# gcc definetest.c -o definetest -DA=C -DB
[root@localhost test]# ./definetest
define A = C

首先简单介绍一下gcc编译时-D的意思,-D其实就是在预处理时进行宏定义,和在代码中用#define实现的是一样的。而D后面紧跟的就是宏定义的内容:-DA,相当于在代码中#define A;而-DA=C就相当于在代码中的#define A C。
首先第一种,也是最简单的编译方式,什么都没有定义。但是却在第一个分支执行了,这是为什么呢?因为这时A没有被定义过,B也没有被定义过,于是未定义等于未定义,于是在第一个分支中就执行了。
那这时候就会考虑怎么才能跑到第三个分支去呢?第二种编译方式基本算是最简单的解决方法了,宏定义A为空,然后A被定义为空,而B和C仍是未定义,于是就会跑到第三个分支。
第三种情况应该是最有意思的一种情况,大家一般都会认为程序应该会执行到第二个分支,打印出define A = C,但是却仍在第一分支就实现了。其实这就是那种“它被定义了,但它却被定义为没定义”的情况,将A定义为C,但是C却是“未定义”,于是A就变成了“未定义”,而B本身也是“未定义”,所以A就和B一样了,所以在第一分支就实现了。
 然后这个时候如果把C定义一下,或者将B定义一下,只要保证两者不都是“未定义”,就会进入到程序的第二分支了。分别对应第四和第五种编译方式。

没事研究下C#虚拟光驱,有所收获!相关推荐

  1. 在Linux操作系统下使用虚拟光驱的方法

    在Linux 下使用虚拟光驱 其实根本不需要什么虚拟光驱软件,用mount命令就可以完成. 1. 把光盘制作成iso文件 cp /dev/cdrom XXXXX.iso XXXXX.iso为你所命名的 ...

  2. linux 虚拟光驱软件,在Linux操作系统下使用虚拟光驱的方法

    在Linux下使用虚拟光驱 其实根本不需要什么虚拟光驱软件,用mount命令就可以完成. 1. 把光盘制作成iso文件 cp /dev/cdrom XXXXX.iso XXXXX.iso为你所命名的镜 ...

  3. linux显示虚拟光驱,在Linux操作系统下使用虚拟光驱的方法

    在Linux 下使用虚拟光驱 其实根本不需要什么虚拟光驱软件,用mount命令就可以完成. 1. 把光盘制作成iso文件 cp /dev/cdrom XXXXX.iso XXXXX.iso为你所命名的 ...

  4. linux下使用虚拟光驱,在Linux操作系统下使用虚拟光驱的方法

    在Linux下使用虚拟光驱 其实根本不需要什么虚拟光驱软件,用mount命令就可以完成. 1. 把光盘制作成iso文件 cp /dev/cdrom XXXXX.iso XXXXX.iso为你所命名的镜 ...

  5. Linux中光驱设备如何使用,如何在Linux操作系统下使用虚拟光驱

    如何在Linux操作系统下使用虚拟光驱: 在Linux下使用虚拟光驱 其实根本不需要什么虚拟光驱软件,用mount命令就可以完成. 1. 把光盘制作成iso文件 $cp /dev/cdrom XXXX ...

  6. Linux下使用虚拟光驱

    在Linux下使用虚拟光驱 其实根本不需要什么虚拟光驱软件,用mount命令就可以完成. 1. 把光盘制作成iso文件 cp /dev/cdrom XXXXX.iso XXXXX.iso为你所命名的镜 ...

  7. DOS下的虚拟光驱:ISOEMU 1.05 中文版

    <!-- emo&:rolleyes:--><!-- endemo--> ISO镜像文件引导系统 ISOEMU是一款比较有趣的软件,安装后可以借助硬盘上的ISO 镜像文 ...

  8. 如何在Linux下使用虚拟光驱

    其实根本不需要什么虚拟光驱软件,用mount命令就可以完成. 1. 把光盘制作成iso文件 cp /dev/cdrom XXXXX.iso XXXXX.iso为你所命名的镜像文件.执行此命令之后就可以 ...

  9. Linux 下实现虚拟光驱功能,查看iso文件内容

    1,创建挂载点(也可以不创建,直接用现有的目录) openSUSE:~ # mkdir /mnt/iso 2,挂载ISO文件至创建的挂载点 openSUSE:~ # mount -t iso9660 ...

最新文章

  1. AIX和linux SSH互信
  2. php查询数据存到下一界面_PHP从另一个页面获取数据
  3. Bootstrap的轮播图
  4. 协议转换器的特点有哪些?
  5. win7系统还原失败怎么解决
  6. Easytrader踩坑之旅(二)
  7. ToolStripContainer
  8. win7,win10系统激活工具下载
  9. VB程序设计教程(第四版) 龚沛曾
  10. 各种计算机控制系统特点小结
  11. 计算机云处理器,IBM推出最新量子处理器 等于6.5万比特普通计算机
  12. Oracle错误——user ** lacks CREATE SESSION privilege logon denied
  13. 【历史上的今天】7 月 12 日:世界上第一台商用数字计算机;Python 之父卸任 BDFL;Wacom 成立
  14. 降维算法(PCA/LDA/LLE/LEP/FA)总结
  15. 漫谈测试成长之探索——测试用例评审
  16. Day2 QT常用基础类型(自用)
  17. socket的阻塞模式和非阻塞模式
  18. php神盾解密工具 注册码_教你如何解密 “ PHP 神盾解密工具 ”
  19. 奔驰采用鸿蒙系统,余承东官宣:鸿蒙系统正式登陆奔驰S级
  20. DOP:精度衰减因子( Dilution of Precision)

热门文章

  1. Java中继承、this关键字、super关键字
  2. python实例化次数怎么算,我需要一个Python类来跟踪它被实例化的次数
  3. 阿里上线了一款新的电商app
  4. 2021新媒体内容生态数据报告
  5. 2021巨量引擎连锁经营行业洞察报告
  6. 我的B端产品经理工作流
  7. vc6开发一个抓包软件_开发一个软件多少钱?3种软件开发公司报价
  8. 【2016年第2期】专题导读:大数据与社会治理
  9. 《大数据》2015年第2期“研究”——大数据时代的数据传输网
  10. 【Servlet】Servlet体系结构