一 :C语言预处理
1:由源码到可执行程序的过程
(1)源码.c->(编译)->目标文件.o->elf可执行程序
(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序
(3)源码.c->(编译)->汇编文件.s->(汇编)-> 目标文件.o->(链接)->elf可执行程序
(4)源码.c->(预处理)->预处理过的.c源文件->(编译)->汇编文件.s->(汇编)-> 目标文件.o->(链接)->elf可执行程序
预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其他会额外用到的可用工具,合起来叫工具编译链。gcc就是一个编译工具链。
2:预处理的意义
(1)编译器本身的只要目的是编译源代码,将c的源代码转化成.s的汇编代码。编译器聚焦核心功能后,就把一些非核心的功能剥离到预处理器去了。
(2)预处理器帮编译器做一些编译前的杂事
3:编程中的常见预处理
(1)#include (#include <> 和 #include ""的区别)
1、引用的头文件不同
#include< >引用的是编译器的类库路径里面的头文件。
#include“ ”引用的是你程序目录的相对路径中的头文件。
2、用法不同
#include< >用来包含标准头文件(例如stdio.h或stdlib.h).
#include“ ”用来包含非标准头文件。
3、调用文件的顺序不同
#include< >编译程序会先到标准函数库中调用文件。
#include“ ”编译程序会先从当前目录中调用文件。
4、预处理程序的指示不同
#include< >指示预处理程序到预定义的缺省路径下寻找文件。
#include“ ”指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。
5、更深层次来说:<>的话C语言编译器只会到系统指定目录(编译器中配置的或者操作系统配置的寻找目标,譬如在ubuntu中是/usr/include目录)去寻找这个头文件(隐含意思就是不会到当前目录下找),如果找不到就会提示文件不存在;而" "的话编译器默认会在当前目录下寻找相应的头文件,如果没有找到的然后再到系统指定目录去寻找,如果还没找到则提示文件不存在
6、总结+注意:系统虽然允许双引号(" ")来包含系统指定目录,但是一般的使用原则是,如果是系统指定自带的用< > ,如果是自己写的放在当前目录下的用" ",如果是自己写的但是集中放在了一起存放头文件的目录下将来在编译器中用-I参数来寻找,这种情况下用<>。
(2)注释
1:注释是给人看的
2:编译器是不看注释的,编译器不看注释。实际上在预处理阶段,预处理器会拿掉程序中所有的注释语句,到了编译器编译阶段程序中其