做开发都要有特定的环境,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" 也可以找到,为什么还要区别<>和 ""呢?
<> 用这个的头文件,是库自带的文件
“”这个头文件一般是我们在开发时,我们自己或者我们的小伙伴写的
如果我们的程序因为头文件的引用出了错误,我们首先应该会觉得是自己写错了,而不应该觉得是库函数的错,因为也有很多库自带的头文件是我们不常用的,所以这两个不同的符号,可以让我们区别哪个是库写的,哪个是我们自己写的。