zoukankan      html  css  js  c++  java
  • 【C语言】16预处理指令2条件编译

    说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略

    上一篇已经介绍了预处理指令中的宏定义,这篇就介绍一下条件编译

    条件编译的概念

    在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译

    一、基本用法

    1 #if 条件1
    2  ...code1...
    3 #elif 条件2
    4  ...code2...
    5 #else
    6  ...code3...
    7 #endif

    1> 如果条件1成立,那么编译器就会把#if#elif之间的code1代码编译进去(注意:是编译进去,不是执行,很平时用的if-else是不一样的)
    2> 如果条件1不成立、条件2成立,那么编译器就会把#elif #else之间的code2代码编译进去

    3> 如果条件1、2都不成立,那么编译器就会把#else#endif之间的code3编译进去

    4> 注意,条件编译结束后,要在最后面加一个#endif,不然后果很严重(自己思考一下后果)

    5> #if #elif后面的条件一般是判断宏定义而不是判断变量,因为条件编译是在编译之前做的判断,宏定义也是编译之前定义的,而变量是在运行时才产生的、才有使用的意义

    二、举个例子

     1 #include <stdio.h>
     2 
     3 #define MAX 11
     4 
     5 int main ()
     6 {
     7 #if MAX == 0
     8     printf("MAX是0");
     9 #elif MAX > 0
    10     printf("MAX大于0");
    11 #else
    12     printf("MAX小于0");
    13 #endif
    14     return 0;
    15 }

    在第3行定义了一个宏MAX,当然在开发中这个MAX可能被定义在其他头文件中,现在只是为了方便演示,就写到main函数上面了。注意第7到第13行的条件编译语句。
    由于MAX为11,所以#elif的条件成立,第10行代码将会被编译进去,其实编译预处理后的代码是这样的:

    1 /*stdio.h文件中的内容将会代替#include <stdio.h>的位置*/
    2 
    3 int main ()
    4 {
    5     printf("MAX大于0");
    6     return 0;
    7 }

    代码变得非常简洁,输出结果:

    三、其他用法

    1.#if defined()#if !defined()的用法

    #if #elif后面的条件不仅仅可以用来判断宏的值,还可以判断是否定义过某个宏。比如:

    1 #if defined(MAX)
    2     ...code...
    3 #endif

    如果前面已经定义过MAX这个宏,就将code编译进去。它不会管MAX的值是多少,只要定义过MAX,条件就成立。

    条件也可以取反:

    1 #if !defined(MAX)
    2     ...code...
    3 #endif

    如果前面没有定义过MAX这个宏,就将code编译进去。

    2.#ifdef#ifndef的使用

    * #ifdef的使用和#if defined()的用法基本一致

    1 #ifdef MAX
    2     ...code...
    3 #endif

    如果前面已经定义过MAX这个宏,就将code编译进去。

    * #ifndef又和#if !defined()的用法基本一致

    1 #ifndef MAX
    2     ...code...
    3 #endif

    如果前面没有定义过MAX这个宏,就将code编译进去。

  • 相关阅读:
    ORACLE 查看进程数,已执行任务数, 剩余任务数,删除指定任务
    ORACLE 收集统计整个用户数据
    解决Hystrix dashboard Turbine 一直 Loading…… 及其他坑
    利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
    AES加解密
    JAVA POI XSSFWorkbook导出扩展名为xlsx的Excel,附带weblogic 项目导出Excel文件错误的解决方案
    JAVA 文件的上传下载
    shell启停服务脚本模板
    JAVA 设计模式之 原型模式详解
    JAVA 设计模式之 工厂模式详解
  • 原文地址:https://www.cnblogs.com/mjios/p/2971275.html
Copyright © 2011-2022 走看看