首页 > 其他 > 详细

第22课 条件编译使用分析

时间:2016-03-28 14:59:36      阅读:276      评论:0      收藏:0      [点我收藏+]

1. 基本概念

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

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

【实例分析】条件编译初探

22-1.c源文件 经预编译器处理条件编译后的结果(22-1.i文件)
// #include <stdio.h>

#define C 1

int main()
{
    const char* s;

    #if( C == 1 ) //#ifdef主要用于#define C这种情况
        s = "This is first printf...\n";
    #else
        s = "This is second printf...\n";
    #endif

    // printf("%s", s);
    
    return 0;
}

 

# 1 "22-1.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "22-1.c"




int main()
{
    const char* s;


        s = "This is first printf...\n";






    return 0;
}

 

2. 条件编译的本质

(1)预编译器根据条件编译指令有选择的删除代码

(2)编译器不知道代码分支的存在

(3)if…else…语句在运行期进行分支判断

(4)条件编译指令在预编译期进行分支判断

(5)可以通过命令行定义宏

  gcc –Dmarco=value file.c //针对#if语句

  gcc –Dmarco file.c  //针对#ifdef或ifndef语句

【编程实验】通过命令行定义宏

 技术分享

//#include <stdio.h>

int main()
{
    const char* s;
    
    //单步编译时,可能在命令行中进行宏定义
    //如:gcc -E 22-2.c -DC -o 22-2.i
    #ifdef C //注意与22-1.c文件的区别
        s = "This is first printf...\n";
    #else
        s = "This is second printf...\n";
    #endif
    
    //printf("%s",s);
    
    return 0;
}

3.#include的本质

(1)#include的本质是将己经存在的文件内容嵌入到当前文件中

(2)#include的间接包含同样会产生嵌入文件内容操作

技术分享 

  ▲间接包含同一个文件是否会产生编译错误?(答:在预编译阶段,global.h会被两次地嵌入到test.c文件中,此时并不会报错。但进入编译阶段,就会出现错误,如定义或函数重定义)

【实例分析】条件编译的使用

 

(3)条件编译可以解决头文件重复包含的编译错误

#ifndef _HEADER_FILE_H_  //ifndef,否定

#define _HEADER_FILE_H_  //紧接着定义这个宏

  //source code

#endif

4. 条件编译的意义

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

(2)#if…#else…#endif被预编译器处理,而if…else…语句被编译器处理,必然被编译进目标代码。

(3)实际工程中条件编译主要用于以下两种情况:

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

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

【实例分析】产品线区分及调试代码应用

 

5. 小结

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

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

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

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

 

第22课 条件编译使用分析

原文:http://www.cnblogs.com/5iedu/p/5328681.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!