zoukankan      html  css  js  c++  java
  • 被定义了,但它却被定义为未定义——有趣的宏定义

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

    #include<stdio.h>

     
    int main()
    {
    #if (A == B)
            printf("define A = B ");
    #elif (A == C)
            printf("define A = C ");
    #else
            printf("nothing is defined! ");
    #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定义一下,只要保证两者不都是“未定义”,就会进入到程序的第二分支了。分别对应第四和第五种编译方式。
     
     
  • 相关阅读:
    Java并发
    JS的强制类型转换
    JS的原生函数
    JS的类型和值
    解决Oracle临时表空间占满的问题
    nginx location匹配规则
    java.util.ConcurrentModificationException 解决办法
    SQL优化三板斧:精简之道、驱动为王、集合为本
    一次非典型SQL优化:如何通过业务逻辑优化另辟蹊径?
    一次耐人寻味的SQL优化:除了SQL改写,还要考虑什么?
  • 原文地址:https://www.cnblogs.com/idyllcheung/p/11859358.html
Copyright © 2011-2022 走看看