C: #ifdef的简单条件编译

0

今天在看源码时, 发现一个很神奇的用法, 可能有大神在以前早已知晓甚至经常使用, 不过对于菜鸟的我来说, 还是像发现新大陆那样 , 究竟是什么语法呢? 我们一步步来看看吧:

#include "stdio.h"
int main()
{
    if(1==1)
    {
        printf("Hello, If\n");
        {
            printf("testtest");
        }
    }
    return 3;
}

代码逻辑比较简单, 主要的意思就是: 当1==1(恒为真), 分别执行:

printf("Hello, If\n");
printf("testtest");

其中, 嵌套的{}可以不用管, 因为在c语言并未没有严格的限制, 只要这个完整成对就可以.
上面的输出结果是:
图片描述

可能有些童鞋不解这个{}, 因为这个看起来很干扰人, 为什么要这么写? 一开始我也很好奇这样的用法有什么意义? 但如果看到下面的代码, 可能我们就能明白这样语法的其中一些意义了..

不卖关子了, 在原来的基础上, 再完善下代码:

#include "stdio.h"
int main()
{
    if(1 == 1)
    {
        printf("Hello, If\n");
        #ifdef HEHE
        if (1==1)
        {
            printf("hehe\n");
        }
        else
        #endif
        {
            printf("testtest");
        }
    }
    return 3;
}

能看到差别么? 差别就是多了中间那段#ifdef....#endif
熟悉C的童鞋都见过这个语法, 不过在这里还是简单介绍下这个语法:
这种语法叫做: 条件编译

条件编译:
可以通过设置不同的条件,在编译时编译不同的代码,预编译指令中的表达式与C语言本身的表达式基本一至如逻辑运算、算术运算、位运算等均可以在预编译指令中使用。之所以能够实现条件编译是因为预编译指令是在编译之前进行处理的,通过预编译进行宏替换、条件选择代码段,然后生成最后的待编译代码,最后进行编译。

从上面的解释,我们可以知道, 因为这段在预编译指令, 让我们的代码能够更加自由灵活的实现我们想要的效果.
就好像上面添加后的代码, 大体的意思是: 如果HEHE有被宏定义语法所定义.那么那段代码将会生效, 实际代码将变成下面那样:

if(1 == 1)
   {
       printf("Hello, If\n");
       if (1==1)
       {
           printf("hehe\n");
       }
       else
       {
           printf("testtest");
       }

可以看到效果了吗? 如果这段在条件编译范围内的代码生效了, 那么下面的else将和我们之前看似多余的{}组成了一个else代码块.又因为1==1, 所以只会执行

printf("hehe\n");

而不会执行:

printf("testtest");

来看看运行结果:

图片描述

这似乎没有出现我们上面说的结果, 是因为什么呢? 当我们回顾下代码, 我们会发现, 这个输出是正确的, 因为我们没有定义HEHE, 事不宜迟, 在头部加上宏定义:

#define HEHE 123

最终源代码:

#include "stdio.h"
#define HEHE 123
int main()
{
    if(1 == 1)
    {
        printf("Hello, If\n");
        #ifdef HEHE
        if (1==1)
        {
            printf("hehe\n");
        }
        else
        #endif
        {
            printf("testtest");
        }
    }
    return 3;
}

再运行一下, 得到结果:
图片描述

这才是我们预计中的结果, 通过上面一个简单的示范, 我们就能比较清楚这个条件编译的语法可以让我们的代码变得多灵活, 如果有哪里说得不正确, 欢迎大神指点!
转载请注明来源: https://segmentfault.com/a/11...


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

JasonKIDD · 2017年04月17日

呵呵,我以为是新大陆?

回复

载入中...