c语言编译过程
c源代码->预处理->编译->优化->汇编->链接->可执行文件
预处理(preprocessing) —— 生成.i文件
- 对c源代码中的伪指令或预处理指令(#开头的指令)和特殊符号进行处理。
- 会删除注释和空白字符。
gcc test.c -o test.i -E
预处理指令是以#号开头的代码行,#号必须是该行除了任何空白字符外的第一个字符,#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符,整行语句构成了一条预处理指令。
伪指令:
- 宏定义 #define #把后面参数换成字符串 ##参数连接到一起
- 条件编译指令 #if #elif #else #endif #ifdef #ifndef
- 头文件包含指令 #include
- 特殊符号
__LINE__
___FILE__
__DATE__
__STDC__
__TIME__
#error
#line
#pragma
编译阶段(compliling) —— 生成.s文件
gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。
gcc test.c -o test.s -S
汇编阶段(assembling)– 生成.o文件
把编译阶段生成的.s文件转成二进制目标代码。
gcc test.c -o test.o -c
链接阶段(link) —— 生成可执行文件
将.o文件链接成可执行文件。
gcc test.c -o test