简析编译与链接

做开发都要有特定的环境,windows一般用IDE(集成开发环境),Linux一般用gcc。

一个源代码生成一个可以运行的程序,要经过以下几步:

.c / .cpp------------> .i ---------->.s /.asm ----------->.0/.obj ...  .lib  .dll ----------->.exe

                 1                        2                             3                                               4                                        

1.预处理(也叫预编译)

主要任务是进行文本处理:

(1)删除注释(生成新文件时  .i )

(2)字符替换(宏替换) #define

          #define DOUBLE(x)  x+x

           int b=DOUBLE(10)               //20

           int c=DOUBLE(10)*10         //10+10*10=110

         所以宏就是字符替换,一定要写出来

(3)解析预处理指令(以#开头的) #include   #if  0

不解决#pragma,这个指令不是标准的

#line为了重新定义原来的行号,定义到没有被替换之前的行号

2.编译

主要就是为了纠错

编译原理,通过词法分析,语法分析,语义分析,发现不符合词法语法语义的错误,具体参照《编译原理》

头文件不单独被编译,但是如果被引用的话,就被编译

3.汇编

任务就是翻译,将汇编指令翻译成机器码

4.链接

主要任务就是找符号

link 无法解析的外部符号:

(1)函数未实现

(2)函数名写错了

(3)符号重定义


在一个工程中,会有很多文件

1.源文件(.c/.cpp)主要放函数的实现

2.头文件 主要放函数的声明 

#pragma once // 预防头文件被重复引用,一般防止头文件开始

重复引用是因为头文件里面可以会引用其他头文件,这些头文件都可能被源文件使用,所以可以会被重复引用。

#include<stdio.h>  //从系统路径去查找头文件

#include“tmp.h”    //首先从项目所在文件夹路径查找,如果没有找到,再去系统路径查找

(系统路径是操作系统自己知道的路径,比如我们安装一个程序的时候,如果可以选择路径,我们选择的路径就会被操作系统记住,如果此时我们将路径改变了,操作系统不会知道,它还是以为在原来的路径,此时查找就找不到路径了,除非改变路径时,将操作系统做的一些记录也改变了)

理论上来说""都可以查找,#include"stdio.h" 也可以找到,为什么还要区别<>和 ""呢?

<>  用这个的头文件,是库自带的文件

“”这个头文件一般是我们在开发时,我们自己或者我们的小伙伴写的

如果我们的程序因为头文件的引用出了错误,我们首先应该会觉得是自己写错了,而不应该觉得是库函数的错,因为也有很多库自带的头文件是我们不常用的,所以这两个不同的符号,可以让我们区别哪个是库写的,哪个是我们自己写的。























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值