• C语言-第17课


    第17课 - 条件编译使用分析

     

    1. 基本概念

    (1) 条件编译的行为类似于C语言中的ifelse

    (2) 条件编译是预编译指示命令,用于控制是否编译某段代码。

    #include <stdio.h>

    #define C 1

    int main()

    {

        #if( C == 1 )

            printf("This is first printf... ");

        #else

            printf("This is second printf... ");

        #endif

        return 0;

    }

    运行结果:This is first printf...

    这个结果和if else的结果是一样的,但是在预编译的过程中确是不同的。

    gcc -DC=1 -E test.c -o test.i  宏定义

     

    1. #include的困惑

    #include的本质是将已经存在的文件内容嵌入到当前文件中。

    #include的间接包含同样会产生嵌入文件内容的动作。

     

    问题:间接包含同一个头文件是否会产生编译错误。

    如何随心所欲的包含头文件。

    // global.h

    int global = 10;

     

    // test.h

    #include <stdio.h>

    #include "global.h"

    const char* NAME = "Hello world!";

    void f()

    {

        printf("Hello world! ");

    }

     

    // test.c

    #include <stdio.h>

    #include "test.h"

    #include "global.h"

    int main()

    {

        f();   

        printf("%s ", NAME);

        return 0;

    }

    这样的三个文件,我们进行编译,是通过不了的,因为#include "global.h"

    被引用了两次。当然我们可以删除一个,完成问题的解决。但是对于较多的程序代码,这样的操作就是不可取的,我们现在来修改// global.h文件:

    #ifdef _GLOBAL_

    #define _GLOBAL_

    int global = 10;

    #endif

    这样的运行,我们就会发现结果很好的呈现。以这样的技术,可以将文件隔离。

     

    1. 条件编译的意义

    l 条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码。

    l #if#else#endif被预编译器处理;而;而ifelse语句被编译器处理,必然被编译进目标代码。

    实际工程中条件编译主要用于一下两种情况:

    不同的产品线共用一份代码

    区分编译产品的调试版和发布版

     

    1. 产品线区分及调试代码应用

    #include <stdio.h>

    #ifdef DEBUG

        #define LOG(s) printf("[%s:%d] %s ", __FILE__, __LINE__, s)

    #else

        #define LOG(s) NULL

    #endif

    #ifdef HIGH

    void f()

    {

        printf("This is the high level product! ");

    }

    #else

    void f()

    {

    }

    #endif

    int main()

    {

        LOG("Enter main() ...");   

        f();   

        printf("1. Query Information. ");

        printf("2. Record Information. ");

        printf("3. Delete Information. ");

        #ifdef HIGH

        printf("4. High Level Query. ");

        printf("5. Mannul Service. ");

        printf("6. Exit. ");

        #else

        printf("4. Exit. ");

        #endif   

        LOG("Exit main() ...");

        return 0;

    }

    通过gcc -DDEBUG test.c等操作,我们能得到不同的运行结果。

     

    小结:

    (1) 通过编译器命令行能够定义预处理器使用的宏。

    (2) 条件编译可以避免重复包含头同一个头文件。

    (3) 条件编译是在工程开发中可以区别不同产品线的代码。

    (4) 条件编译可以定义产品的发布版和调试版。

  • 相关阅读:
    7行代码看EntityFramework是如何运行
    我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)
    利用Microsoft.Office.Interop.Excel 将web页面转成PDF
    IT农民的开发人员工具清单(2013年)
    我在项目中运用 IOC(依赖注入)--实战篇
    我在项目中运用 IOC(依赖注入)--入门篇
    我用ASP.NET缓存之数据缓存
    我用ASP.NET缓存之OutputCache
    Resharper 使用帮助-自动生成文件头
    玩转变量、环境变量以及数学运算(shell)
  • 原文地址:https://www.cnblogs.com/free-1122/p/9720711.html
Copyright © 2020-2023  润新知