zoukankan      html  css  js  c++  java
  • C语言预处理命令之条件编译

    在C语言中,预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

    条件编译指令将决定哪些代码被编译,哪些是不被编译的。可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。

    下面是部分预处理指令:

    指令用途
    #  空指令,无任何效果
    #include  包含一个源代码文件
    #define  定义宏
    #undef  取消已定义的宏
    #if  如果给定条件为真,则编译下面代码
    #ifdef  如果宏已经定义,则编译下面代码
    #ifndef  如果宏没有定义,则编译下面代码
    #elif  如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
    #endif  结束一个#if……#else条件编译块
    #error  停止编译并显示错误信息

    1.#if指令

    #if 指令检测跟在后面的常量表达式,如果表达式为真,则编译后面的代码,直到出现#else、#elif或#endif为止;否则就不编译。

    2.#endif指令

    #endif用于终止#if预处理指令。

    #include<stdio.h>
    #define DEBUG 0
    int main()
    {
        #if DEBUG
        printf("Debugging
    ");
        #endif
        printf("Running
    ");
        return 0;
    }

    由于程序定义DEBUG宏代表0,所以#if条件为假,不编译后面的代码直到#endif,所以程序直接输出Running。

    如果去掉#define语句,效果是一样的。

    3.#ifdef和#ifndef

    #include<stdio.h>
    #define DEBUG
    int main()
    {
        #ifdef DEBUG
        printf("YES
    ");
        #endif
        #ifndef DEBUG
        printf("NO
    ");
        #ednif
        return 0;
    }

    #ifdefined等价于#ifdef;#if!defined等价于#ifndef

    4.#else指令

    #else指令用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码。#endif指令将终止上面的条件块。

    #include<stdio.h>
    #define DEBUG
    int main()
    {
        #ifdef DEBUG
        printf("Debugging
    ");
        #else
        printf("Notdebugging
    ");
        #endif
        printf("Running
    ");
        return 0;
    }

    5.#elif指令

    #elif预处理指令综合了#else和#if指令的作用。

    #include<stdio.h>
    #define TWO
    int main()
    {
        #ifdef ONE
        printf("1
    ");
        #elif defined TWO
        printf("2
    ");
        #else
        printf("3
    ");
        #endif
        return 0;
    }

    程序很好理解,最后输出结果是2。

  • 相关阅读:
    iOS中NSArray的过滤
    Android SurfaceView 的应用
    让你的模拟器不再卡:VirtualBox安裝 Androidx86 4.0
    SurfaceView 绘图覆盖刷新及脏矩形刷新方法
    ios iphone开发内存管理
    IOS上的socket通信
    【转载】反射之实例创建ConstructorInfo.Invoke 对比 Activator.CreateInstance
    cookie 和session 的区别详解
    LPC2132 调试记 (转)
    三极管开关电路基础
  • 原文地址:https://www.cnblogs.com/wuyudong/p/3669754.html
Copyright © 2011-2022 走看看