编译预处理
预处理指令主要有三种
- 包含文件:将文件以"#include"格式包含的文件复制到源文件中,可以是头文件,也可以是其他程序文件
- 宏定义指令:#define定义一个宏,#undef指令删除一个宏定义
- 条件编译:根据**#ifdef和ifndef**后面的条件决定需要编译的代码
包含文件指令(#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;
}