条件编译使用分析

来源:互联网 发布:mysql语句优化 编辑:程序博客网 时间:2024/05/17 01:21

1 基本概念

  • 条件编译的行为类似于C语言中的if…else…
  • 条件编译是预编译指示命令,用于控制是否编译某段代码。

这里写图片描述

实例分析:条件编译初探

// #include <stdio.h>#define C 1int main(){    const char* s;    #if( C == 1 )        s = "This is first printf...\n";    #else        s = "This is second printf...\n";    #endif    // printf("%s", s);    return 0;}

2 条件编译的本质

  • 预编译器根据条件编译指令有选择的删除代码。
  • 编译器不知道代码分支的存在。
  • if…else…语句在运行期进行分支判断。
  • 条件编译指令在预编译期进行分支判断。
  • 可以通过命令行定义宏。
    • 如:gcc –Dmacro=value file.c 或 gcc –Dmacro file.c

当通过命令行定义宏时,如果未进行赋值则宏的默认值为1,如果在文件内进行宏未进行赋值则为空。

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

//#include <stdio.h>int main(){    const char* s;    #ifdef C        s = "This is first printf...\n";    #else        s = "This is second printf...\n";    #endif    //printf("%s", s);    return 0;}

3 #include的本质

  • #include的本质是将已经存在的文件嵌入到当前文件中。
  • #include的间接包含同样会产生嵌入文件内容的操作。
  • 问题:间接包含同一个头文件是否会产生编译错误?
    • 有可能会。

这里写图片描述

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

这里写图片描述

实例分析:条件编译的使用

// global.h#ifndef _GLOBAL_H_#define _GLOBAL_H_int global = 10;#endif
// test.h#ifndef _TEST_H_#define _TEST_H_#include "global.h"const char* NAME = "test.h";char* hello_world(){        return "Hello world!\n";}#endif
// #include <stdio.h>#include "test.h"#include "global.h"int main(){    const char* s = hello_world();    int g = global;    // printf("%s\n", NAME);    // printf("%d\n", g);    return 0;}

4 条件编译的意义

  • 条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码。
  • #if…#else…#endif被预编译器处理,而if…else…语句被编译器处理,必然被编译进目标代码。
  • 实际工程中条件编译主要用于以下两种情况:
    • 不同产品线共用一份代码;
    • 区分编译产品的调试版和发布版。

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

// product.h#define DEBUG 1#define HIGH  1
#include <stdio.h>#include "product.h"#if DEBUG    #define LOG(s) printf("[%s:%d] %s\n", __FILE__, __LINE__, s)#else    #define LOG(s) NULL#endif#if HIGHvoid f(){    printf("This is the high level product!\n");}#elsevoid f(){}#endifint main(){    LOG("Enter main() ...");    f();    printf("1. Query Information.\n");    printf("2. Record Information.\n");    printf("3. Delete Information.\n");    #if HIGH    printf("4. High Level Query.\n");    printf("5. Mannul Service.\n");    printf("6. Exit.\n");    #else    printf("4. Exit.\n");    #endif    LOG("Exit main() ...");    return 0;}

5 小结

  • 通过编译器命令行能够定义预处理器使用的宏。
  • 条件编译可以避免重复包含同一个头文件。
  • 条件编译是在工程开发中可以区分不同产品线的代码。
  • 条件编译可以定义产品的发布版和调试版。