编译与链接有四个过程:
(1)预处理
(2)编译
(3)汇编
(4)链接
(1)预处理
源文件和头文件被预处理成一个.i文件、(-E表示只进行预处理)
g++ -E hello.cpp -o hello.i
-E:意味着只执行到预编译,直接输出预编译结果。
预处理过程主要处理那些源文件中的以“#”开始的预编译指令。包括#include,#define, #if,等等。
主要的处理规则如下:
(1)将所有的#define删除,并且展开所有的宏。
如#define a b 就是将所有的a替换成b。但作为字符串常量a则不替换。
(2)处理所有的条件预编译指令,,如#if,#ifdef,#else,#endif(以此来决定对哪些代码进行处理,将那些不必要的
代码过滤掉)
(3)处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。()这个过程是递归进行的。其中系统提供的头文件一般放在/usr/include下面,用<>表示。开发人员自定义的头文件放在与源程序同一个目录下,用“”表示。
(4)过滤所有的注释“//“和”/* */“之间的内容。
(5)添加行号和文件名标识。比如 #2 "test.c" 2
(6)保留所有的#pragma编译器指令,因为编译器需要使用他们。(下面是pragma的一些参数,详情看 https://baike.baidu.com/item/%23pragma)
(2) 编译,汇编
编译过程就是把预处理的文件进行一系列的词法分析,语法分析,语义分析以及优化后产生相应的汇编代
码文件。相当于:
g++ -S hello.i -o hello.s
-S(大写):表示只执行到源代码到汇编代码的转换,输出汇编代码。
编译器就是将高级语言翻译成机器语言的一个工具。
编译过程分为6步:
词法分析(扫描)
语法分析
语义分析
源代码优化
(其实应该上面四个才叫编译)
(下面两个叫汇编了)
代码生成