C语言的编译过程
预编译
将.c中的头文件展开,宏展开生成的文件是.i文件
编译
将预处理生成的.i文件生成.s汇编文件
汇编
将.s汇编文件生成.o目标文件
链接
将.o文件链接成目标文件
预处理
include
- #include<> :在系统指定的路径下找头文件;
- #include “”:先在当前目录下找头文件,找不到再到系统指定路径下找头文件;
define
define是定义宏的关键字
不带参的宏
#define PI 3
作用范围:从定义的地方到本文件的末尾
#undef PI //终止PI的使用
带参的宏
#define S(a,b) a*b
int num = S(2,4);
带参宏和带参函数的区别
- 带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈,所以带参宏是浪费了空间,因为被展开多次,节省时间;
- 带参函数代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要压栈弹栈,有个调用的过程所以说带参函数浪费了时间,节省了空间;
- 带参函数的形参是有类型的,带参宏的形参没有类型名。
选择性编译
定义宏,如下代码:
#define AAA
如果在当前.c文件中定义过AAA 这个宏 就编译段1 否则编译段2,如下代码:
#ifdef AAA
段1
#else
段2
#endif
如果在当前.c文件中没有定义过AAA 这个宏 就编译段1 否则编译段2,如下代码:
#ifndef AAA
段1
#else
段2
#endif
如果表达式为真编译段1,否则编译段2,如下代码:
#if 表达式
段1
#else
段2
#endif