面试被问到C编译原理,所以回来整理一下。
编译主要分为四个大步骤:预编译、编译(.s、.asm)、汇编(.obj、.o、.a、.ko)、链接(.exe、.elf、.axf等),在C/C++中统称为编译。
前面文章 https://blog.youkuaiyun.com/a063225/article/details/90181715 介绍过集成开发环境、编译器,这里再说明一下,集成开发环境是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器,调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。
编辑器:编写代码的一些窗口。
编译器:检查用户代码的一些语法错误,将其编译成汇编代码。
汇编器:将编译出来的汇编文件编译成一定功能的目标代码。
连接器:将目标代码连接成可执行文件。
(一)预编译
使用的gcc命令是:gcc –E
对应于预处理命令cpp
a. 宏定义指令:将所有的#define删除,并且展开所有的宏定义。
b. 条件编译指令:处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等。
c. 头文件包含指令:处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
d. 特殊符号指令:预编译器可研识别一些特殊的符号,例如:删除所有注释 “//”和”/* */”。
e.为Debug及日志添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
f. 保留所有的#pragma编译器指令,因为编译器需要使用它们。