c编译过程

c的编译过程是一个很简单的问题,但是就是有很多我会经常忘记,包括我自己,所以既然这个东东非常重要又很容易忘记,所以多看几次就好了嘛,所以今天在这里总结一下。

参考网站:http://www.cnblogs.com/wuyouxiaocai/p/5701088.html

预处理

(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换

(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些

(3)处理#include,将#include指向的文件插入到该行处

(4)删除所有注释

(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

(6)保留#pragma编译器指令,因为编译器需要使用它们。

那么,什么时候需要预处理呢?

1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

编译

(1)词法分析,

(2)语法分析

(3)语义分析

(4)优化后生成相应的汇编代码

从 高级语言->汇编语言->机器语言(二进制)

链接

就像刚才的hello.c它使用到了C标准库的东西“printf”,但是编译过程只是把源文件翻译成二进制而已,这个二进制还不能直接执行,这个时候就需要做一个动作,

将翻译成的二进制与需要用到库绑定在一块。打个比方编译的过程就向你对你老婆说,我要吃雪糕。你只是给你老婆发出了你要吃雪糕的诉求而已,但是雪糕还没有到。

绑定就是说你要吃的雪糕你的老婆已经给你买了,你可以happy。

原文地址:https://www.cnblogs.com/wenzong/p/7608940.html