又名预编译---正式编译前的预备工作
hello.c
gcc hello.c //gcc编译
a.out
编译:object
预处理阶段:
凡是预处理命令 都是以#开头的
#include<stdio.h>
#if 0
...
#endif
三大块内容:
1.宏定义
2.文件包含
3.条件编译
1.宏定义
语法:
用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为
#define 标识符 字符串
#define 宏名 宏值
//用宏名代表了这个宏值//宏值,本身其实一串文字字符
说明:
1.宏名一般建议大小,区别于普通变量名
2.宏名命名方法与变量名命名方法一致
3.预处理阶段,做的事情--
文本的原样替换(用宏值对应本文字符串,替换代码中宏名)
a.语法-define 后面不能写分号
b.代码中,""括起来的字符串中的与宏名相同的字符不会被替换
#define N 10
printf("N = %d\n",N);
(1) (2)//第(1)个N不会被替换,第(2)个会被替换
c.使用宏的好处
一改全改//提高代码灵活性
提高代码的可读性
4.宏名---名字---标识符
只想要部分替换:#define宏名 数值(从这开始)
...
#undef 宏名(从这结束)
如果没有用#undef取消宏名的定义,那么默认作用范围,是从#define那行开始一直作用到结尾
5.注意,宏定义,必须都在同一行
6.如果宏定义要写成多行,那么需要使用续航符(\)注意:续航符(\)每一行都要 写上去,包括{\
...\
}后面就不用写续航符了
带参宏:
#define 宏名(参数表)字符串
#define 宏名(参数表)宏值
宏函数//注意:本质不是函数
区别:
1.带参宏---预处理阶段就处理完成了做文本的远洋替换,不需要做语法检查
2.函数---是编译阶段要编译成最终机器代码的,所以函数需要做语法检查
//使用上
3.带参宏---每用一次,代码中就会多一份带参宏对应的宏值
4.函数调用---函数对应代码之后一份
//参数上
5.带参宏---本身做的是文本的替换,不会检查类型
6.函数---需要做形参类型的检查
注意:宏定义时,能加括号的地方尽量都加上,避免宏的副作用
文件包含
#include<文件名>
#include"文件名"//作用:将文件中的内容,包含到最终的.c文件中
#include<stdio.h>//如果是<>默认直接到系统默认的路径下去寻找指定的头文件
//如果是""默认先到当前目录下寻找指定的头文件,如果没有,才到系统默认路径 下寻找
条件编译:
//形式1:
#ifdef 标识符
程序段1
#else
程序段2
#endif
return 0;
(相当于if-else语句)
或者
#ifdef 标识符
程序段1
#endif
//形式2
#ifndef 标识符
程序段1
#else
程序段2
#endif
//形式3
#if 表达式
程序段1
#else
程序段2
#endif