源程序.c----->编译-----目标文件.obj----->链接-----可执行文件.exe---->运行
预处理:
展开头文件/宏替换/条件编译/去掉注释/
(test.i main .i)
编译:
检查语法,生成汇编
( test.s main .s)
汇编:
汇编代码转换机器码
(test.o main.o)
链接:
链接到一起生成可执行程序
a.out
预处理
C提供的三种预处理功能
这三种预处理包括:宏定义、文件包含、条件编译
- 预处理命令行必须从#开始
- 预处理的每一条必须单独占用一行
- 预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。
宏替换
- 宏替换不占用运行时间
- 使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改
- 宏定义可以嵌套
- 宏定义不分配内存,变量定义分配内存
- 宏替换只作替换,不做计算,不做表达式求解
- 宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
文件包含
- 功能:一个源文件可将另一个源文件的内容全部包含进来
凡是C源程序中行首以#标识的控制行都是预处理命令 - 一般形式: #include “ 文件名” 或 #include < 文件名>
区别:
用尖括号时,编译器从C 标准库文件所在的目录中寻找要包含的文件,这称为标准方式;
用双撇号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。
- 被包含文件内容
源文件(*.c)
头文件(*.h)
- 说明
1 )一个#include 命令只能指定一个被包含文件,如果要包含n 个文件,要用n 个#include 命令;
2 )如果文件1 包含文件2 ,而文件2 中要用到文件3 的内容,则可在file1.c 中定义:
#include “file3.h”
#include “file2.h”
3 )文件包含可以嵌套;
4 )被包含文件与其所在的文件,在预编译后已成为同一个文件,因此,如果file2.h 中有全局变量,它也在file2.c 文件中有效,不必用extern 声明。
特别注意:
由于嵌套包含文件的原因一个头文件可能会被多次包含在一个源文件中条件指示符可防止这种头文件的重复处理。