C语言预处理
文章目录
目录
文章目录
前言
一、程序编译的过程
二、编译阶段
1.预处理(*.i)
2.编译(*.s)
3.汇编(*.o)
4.链接
总结
前言
提示:使用vs code(gcc编译器)与vs2022来演示c语言的预处理
提示:以下是本篇文章正文内容,下面案例可供参考
一、程序编译的过程
二、编译阶段
以下是使用vscode——gcc编译器
1.预处理(*.i)
test.c
#include <stdio.h>
#include "test.h"
extern int add(int x,int y);
int main()
{//代码int x=10;int y=20;int sum = add(x,y);printf("%d",sum);return 0;
}
test.h
typedef struct test
{int b;char a;
}test1;
我们使用指令编译——》
gcc -E test.c -o test.i
会得到一个*.i的文件
过后我们会看见一个test.i的文件
这个就是预处理文件
内容为下:
分析:
它把test.h和test.c的文件合并在一了并且把注释删除了(还会把#define 宏的符号替换或者删除)【这里没有展现出了,你们可以试试看】
总结:
是有用可用的保留,无用的删除——文本操作
2.编译(*.s)
gcc -c test.i
把预编译文件——》编译文件*.s
会得到汇编代码
如下
.file "test.c".text.def __main; .scl 2; .type 32; .endef.section .rdata,"dr"
.LC0:.ascii "%d\0".text.globl main.def main; .scl 2; .type 32; .endef.seh_proc main
main:pushq %rbp.seh_pushreg %rbpmovq %rsp, %rbp.seh_setframe %rbp, 0subq $48, %rsp.seh_stackalloc 48.seh_endprologuecall __mainmovl $10, -4(%rbp)movl $20, -8(%rbp)movl -8(%rbp), %edxmovl -4(%rbp), %eaxmovl %eax, %ecxcall addmovl %eax, -12(%rbp)movl -12(%rbp), %eaxmovl %eax, %edxleaq .LC0(%rip), %rcxcall printfmovl $0, %eaxaddq $48, %rsppopq %rbpret.seh_endproc.ident "GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0".def add; .scl 2; .type 32; .endef.def printf; .scl 2; .type 32; .endef
分析:
把c语言转变为汇编
其中有语法分析,语义分析,词法分析,符号分析等
3.汇编(*.o)
gcc -c test.s
把汇编文件变成二进制
4.链接
每一个目标文件由链接器捆绑在一起,形成一个可执行的程序。
1.合并段表
2.符号表的合并和符号表的定位