概述
c
语言编译的
4
个阶段
:
预编译、编译、汇编、链接
预处理阶段会在源代码中查找预编译指令
,
其中主要是
头文件展开(include),
宏替换
(defind)
,
选择性编译(ifdef)
三种指令
预处理命令以符号
#
开头。
好处
:
1,
扩展了
c
程序设计的环境
2,
简化程序开发过程
3,
提高程序的可读性
注意
:
1,
实际上不是
c
语言的一部分
2,
预编译指令在编译前由预处理程序对源文件的预处理文件进行加工。
include
作用
引入头文件
在预编译编译阶段会将该行代码替换为引入的头文件中的代码
语法
语法1:
#include <要引入的头文件名>
用尖括号包含头文件,在系统指定的路径下找头文件
语法2:
#include "要引入的头文件名"
用双引号包含头文件,先在当前目录下找头文件,找不到,再到系统指定的路径下
找
注意
1,include
经常用来包含头文件,可以包含源文件,但是大家不要包含源文件
,
头文件
中可以定义函数
,
但是不建议定义
如
:
test.c
void method()
{
}
arr.c
#include "test.c"
xxx
main.c
#include "test.c"
#include "arr.c"
int main()
{
}
void method()
{
}
void method()
{
}
xxx
2,
预处理只是对
include
等预处理操作进行处理并不会进行语法检查
,
编译阶段才会
检查语法是否有误
define : 宏
分类
不带参宏
带参宏
不带参宏
步骤:
1,宏定义
静态定义
#define 宏名称 值
注意
:
值可有可无
动态定义
在代码编译时加
-D
宏名
=
值 或
-D
宏名
2,使用宏
宏名称
3,取消宏
#undef 宏名称
注意
:
一旦取消宏
,
该宏不能在使用
使用范围
:
宏定义开始到取消宏
带参宏
步骤:
1,宏定义
#define 宏名称(形参列表) 代码;
2,使用宏
宏名称(实参列表);
3,取消宏
#undef 宏名称
带参宏与带参函数的区别
带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需
要压栈弹栈。所以带参宏是浪费了空间,因为被展开多次,节省时间。
带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候
要,压栈弹栈。有个调用的过程
所以说,带参函数是浪费了时间,节省了空间。
带参函数的形参是有类型的,带参宏的形参没有类型名。
选择性编译
作用
选择性的对代码进行编译
语法
头文件模版
#ifndef 自定义宏
#define 自定义宏
引入头文件
声明变量
声明函数
#endif
注意
此时需在该头文件对应的源文件中引入该头文件
在使用该源文件中函数的源文件中在引入该头文件
,
此时不会重复声明