编译预处理

预处理指令主要有三种

  1. 包含文件:将文件以"#include"格式包含的文件复制到源文件中,可以是头文件,也可以是其他程序文件
  2. 宏定义指令:#define定义一个宏,#undef指令删除一个宏定义
  3. 条件编译:根据**#ifdefifndef**后面的条件决定需要编译的代码

包含文件指令(#include)

  • 两种写法

  • 使用第一种写法会到系统的"/usr/include/"目录下找指定的文件

  • 使用第二种写法,先在项目目录下找指定文件,如果没有找到再到系统的"/usr/include/"目录下找指定的文件

  • 包含的文件可以是头文件(xxx.h)也可以是源代码(xxx.c)

  • 作用是将指定文件的内容插入的**#include**的位置

#include <文件名>
#include "文件名"

宏定义(#define)

  • 无参数的宏
  • 可以只有宏名没有宏的值
  • 宏定义可以嵌套
  • 主要宏定义不要带分号,否则宏替换的时分号也会被替换进去,导致编译错误
#include <stdio.h>
//定义没有参数的宏
//#define 宏名 宏的值
#define PI 3.1415926
int main(){
    //使用宏,宏替换,宏展开,就是在宏名出现的地方使用宏的值进行替换,可以理解为在源码层面的字符串替换
    printf("宏的使用,宏PI的值为:%lf\n",PI);
    //预编译后结果为:printf("宏的使用,宏PI的值为:%lf\n",3.1415926);
    return 0;
}
  • 有参数的宏
  • 注意宏名与参数列表之间不要出现空格
#include <stdio.h>
//有参数的宏
//#define 宏名(参数列表) 字符串表达式
#define MAX(x,y) ((x)>(y)?(x):(y))
int main(){
    int x = 3,y = 4;
    //使用带参数的宏
    printf("%d与%d中最大的是%d\n",x,y,MAX(x,y));
    //预编译后的结果
    //printf("%d与%d中最大的是%d\n",x,y,((x)>(y)?(x):(y)));
    return 0;
}
  • 取消已经定义的宏使用**#undef**

条件编译(#ifdef和#ifndef)

  • #ifdef条件存在的条件编译
  • 当宏已经被定义就编译指定的代码段
  • 编译前
#include <stdio.h>
#define WINDOWS
int main(){
    //条件编译
    //#ifdef 标识符,表示当前标识符被定义则编译对应的代码,否则就不编译
    #ifdef WINDOWS
        //如果WINDOWS被宏定义了,就编译这段代码
        printf("这是windows操作系统\n");
    #else
        //如果WINDOWS没有被宏定义了,就编译这段代码
        printf("这是未知的操作系统");
    #endif
    return 0;
}
  • 编译后
#include <stdio.h>
#define WINDOWS
int main(){
    //条件编译
    //#ifdef 标识符,表示当前标识符被定义则编译对应的代码,否则就不编译
        //如果WINDOWS被宏定义了,就编译这段代码
        printf("这是windows操作系统\n");
    return 0;
}
  • #ifndef条件不存在的条件编译
  • 当宏已经没有被定义就编译指定的代码段
  • 编译前
#include <stdio.h>
#define WINDOWS
int main(){
    //#ifndef条件编译
    #ifndef WINDOWS
        //如果WINDOWS没有被宏定义了,就编译这段代码
        printf("这不是windows操作系统\n");
    #else
        //如果WINDOWS被宏定义了,就编译这段代码
        printf("这是windows操作系统");
    #endif
    return 0;
}
  • 编译后
#include <stdio.h>
#define WINDOWS
int main(){
    //#ifndef条件编译
        //如果WINDOWS被宏定义了,就编译这段代码
        printf("这是windows操作系统");
    return 0;
}