文章目录
目录
文章目录
前言
一、程序编译的过程
二、编译阶段
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	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	subq	$48, %rsp
	.seh_stackalloc	48
	.seh_endprologue
	call	__main
	movl	$10, -4(%rbp)
	movl	$20, -8(%rbp)
	movl	-8(%rbp), %edx
	movl	-4(%rbp), %eax
	movl	%eax, %ecx
	call	add
	movl	%eax, -12(%rbp)
	movl	-12(%rbp), %eax
	movl	%eax, %edx
	leaq	.LC0(%rip), %rcx
	call	printf
	movl	$0, %eax
	addq	$48, %rsp
	popq	%rbp
	ret
	.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.符号表的合并和符号表的定位


















![[Golang实战]如何快速接入chatgpt/openai?[引入go-gpt3][新手开箱可用]](https://img-blog.csdnimg.cn/7cd791742c7c43899aac49236c96e35b.png)

